我想获得列的平均值,其他列的值为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子句中的平均值为零。
还有其他类似方式吗?
感谢。
答案 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!!!