【问题标题】:Where clause condition on aggregate functions [duplicate]聚合函数的Where子句条件[重复]
【发布时间】:2011-01-11 21:40:27
【问题描述】:

我有以下简单的查询,

SELECT US_LOGON_NAME as Username, 
COUNT(I.IS_ISSUE_NO) as Issues
FROM ISSUES I JOIN USERS U ON I.IS_ASSIGNED_USER_ID = U.US_USER_ID
WHERE I.IS_RECEIVED_DATETIME BETWEEN 20110101000000 AND 20110107000000
GROUP BY U.US_LOGON_NAME; 

我想在选择列表中添加额外的 COUNT() 函数,但对它们施加某些 where 条件。这是通过 CASE() 语句以某种方式完成的吗?我尝试将 Where 子句放在选择列表中,但这似乎是不允许的。我不确定这里是否真的需要子查询,但我不这么认为。

例如,我想要一个 COUNT() 函数,它只计算某个范围内的问题,然后是另一个范围内或其他各种条件下的另一个,等等:

 SELECT US_LOGON_NAME as Username, 
 COUNT(I.IS_ISSUE_NO (condition here)
 COUNT(I.IS_ISSUE_NO (a different condition here)

等等……

仍按登录名分组。

谢谢。

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:
    SELECT
      SUM(CASE WHEN I.IS_ISSUE_NO (condition here) THEN 1 ELSE 0 END) AS COND1
      SUM(CASE WHEN I.IS_ISSUE_NO (condition here) THEN 1 ELSE 0 END) AS COND2
    

    【讨论】:

    • COUNT 也算0?我以为只有NULL 没有被计算在内。
    • @Kirk Woll:他的回答中哪里说 COUNT?
    • 是的,但亚当没有数数,他在求和。
    • @Mark,无处可去,诅咒我懒惰阅读。 :)
    【解决方案2】:

    几个解决方案。

    您可以利用 SQL 不计算 NULL 值这一事实:

      SELECT US_LOGON_NAME as Username, 
      COUNT(CASE WHEN <cond>       THEN I.IS_ISSUE_NO ELSE NULL END)
      COUNT(CASE WHEN <other cond> THEN I.IS_ISSUE_NO ELSE NULL END)
      . . .
    

    或者您可以使用 SUM 代替 COUNT:

      SELECT US_LOGON_NAME as Username, 
      SUM(CASE WHEN <cond>       THEN 1 ELSE 0 END)
      SUM(CASE WHEN <other cond> THEN 1 ELSE 0 END)
      . . .
    

    无论哪种情况,您都可以根据需要重复多次。

    【讨论】:

    • 我认为您的CASE 表达式可能是无效语法,因为没有END
    • 我认为你是对的,先生。我刚刚更新了语法。必须停止匆忙。
    【解决方案3】:

    该示例返回每个用户的计数,每个 IssueType

    ;
    with
    q_00 as (
    select
          is_issue_no
        , is_assigned_user_id 
        , case
              when is_issue_no between  1 and 10 then 'A'
              when is_issue_no between 11 and 14 then 'B'
              else  'C'  
          end as IssueType
    from Issues 
    )
    select
          us_logon_name
        , IssueType
        , count(1) as cnt
    from q_00  as a
    join users as u on a.is_assigned_user_id = u.us_user_id
    group by us_logon_name, IssueType
    order by us_logon_name, IssueType ;
    

    SQL 服务器 2005 +

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多