【问题标题】:Average calculation using T-SQL使用 T-SQL 进行平均计算
【发布时间】:2017-08-10 11:23:38
【问题描述】:

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

谁能帮我解决这个问题?

阿伦

【问题讨论】:

    标签: sql-server-2008 case average


    【解决方案1】:

    由于聚合函数忽略 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】:

      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());
      

      【讨论】:

        【解决方案3】:

        这也可以。 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
        

        【讨论】:

          猜你喜欢
          • 2014-12-24
          • 2017-11-10
          • 2018-02-28
          • 1970-01-01
          • 1970-01-01
          • 2018-11-16
          • 2022-11-29
          • 1970-01-01
          • 2014-08-14
          相关资源
          最近更新 更多