AVG中的SQL Server CASE

时间:2013-11-29 04:23:44

标签: sql sql-server

我想获得列的平均值,其他列的值为1或0(显然我无法使用其中)

select 
      avg(case 
              when 
                  column2 = 1 
              then 
                  column1
              else 
                  0 
              end) 
      as avg1, 
      avg(case 
              when 
                  column2 = 0 
              then 
                  column1
              else 
                  0 
              end) 
       as avg2

这不会起作用,因为它降低了平均值,因为它在else子句中的平均值为零。

还有其他类似方式吗?

感谢。

2 个答案:

答案 0 :(得分:1)

假设您的表中有四个值如下:

 +----------------------
 + Column1     Column2
 +---------------------
 + 100           0
 + 50            0
 + 40            1
 + 80            1

如果您使用的是ELSE 0,则表示您将0放在该列上,因此计为1,因此当您平均时,它将成为您的除数的一部分。那么,你将拥有这个公式

Total According Column2 Per Column2 criteria values OVER Total Number of Rows

在上面的案例中,您有四(4)行,因此它会是这样的:

Column2 = 1的示例:

 (40+80)/4

30

Column2 = 0的示例:

 (100+50)/4

37.5

但是,如果您使用的是ELSE NULL,则意味着您不包含此内容 所有行,但只有符合WHEN子句标准的行。

在上面的案例中,每个条件都有两(2),因此会成为 平均功能的除数。

Column2 = 1的示例:

 (40+80)/2

60

Column2 = 0的示例:

 (100+50)/2

75

参见 Fiddle Demo

答案 1 :(得分:0)

SELECT (column1 + column2) / 
((CASE WHEN column1 = 0 THEN 0 ELSE 1 END) + 
(CASE WHEN column2 = 0 THEN 0 ELSE 1 END) + 
(CASE WHEN column1 = 0 AND column2 = 0 THEN 1 ELSE 0 END) AS Average

Hope this Help!!!