我在SQL Server中有一个EMP
表,看起来像这样
ID T_Date Jid Emp_Cost Con_Cost IsActive
--------------------------------------------------------
13178 null 214 0 0 0
12797 null 214 0 55 1
11906 null 214 0 55 1
12916 null 214 0 58 1
我正在执行以下查询
SELECT
AVG(CASE WHEN IsActive = 1 THEN Con_Cost ELSE Emp_Cost END) cost
FROM
EMP
WHERE
Jid = 214
AND (T_Date IS NULL OR T_Date >= sysdate);
我的预期成本值必须为56。
有人可以帮我吗?
阿伦
答案 0 :(得分:0)
AVG
实际上工作正常,因为它的平均值为0 + 55 + 55 + 58除以结果集中的行数。
我相信你要找的是:
select distinct
sum(case when IsActive = 1 then con_cost else emp_cost end) over () /
count(case when IsActive = 1 then 1 else null end) over ()
from emp
where Jid = 214
and (T_Date is null or T_Date >= sysdatetime());
或者您正在寻找:
select avg(con_cost)
from emp
where isActive = 1
and Jid = 214
and (T_Date is null or T_Date >= sysdatetime());
答案 1 :(得分:0)
由于汇总函数会忽略null
个值,因此您可以使用nullif()
将0
更改为null
,如下所示:
select avg(nullif(case
when IsActive = 1 then Con_Cost
else Emp_Cost
end
,0)) as cost
from EMP
where Jid = 214
and (T_Date is null or T_Date >= sysdatetime());
rextester演示:http://rextester.com/NPBOP19522
返回
+------+
| cost |
+------+
| 56 |
+------+
注意:我已将sysdate
更改为sysdatetime()
,但我不知道这是否是您查询的目的。
答案 2 :(得分:0)
这也可以。 http://rextester.com/QIXA57971
SELECT
AVG(CASE WHEN IsActive = 1 THEN Con_Cost ELSE Emp_Cost END) cost
FROM
EMP
WHERE
Jid = 214
AND (T_Date IS NULL OR T_Date >= GETDATE()) AND IsActive = 1;
结果
cost
-----
56