使用T-SQL进行平均计算

时间:2017-08-10 11:23:38

标签: sql-server-2008 case average

我在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。

有人可以帮我吗?

阿伦

3 个答案:

答案 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