2011-01-11 92 views
5

我有以下简单的查询,凡聚合函数子句条件

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()函数来选择列表,但强加某些地方对他们的条件。这是否以某种方式用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) 

等等

仍然按登录名称分组。

感谢。

回答

10
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 
+0

不`COUNT`也算`0`?我以为只有`NULL`不算。 – 2011-01-11 21:49:31

+1

@Kirk Woll:他的答案在哪里说COUNT? – 2011-01-11 21:50:58

4

一些解决方案。

你可以采取的事实,即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) 
    . . . 

在这两种情况下,你可以重复的根据需要多次。

0

该示例返回每个用户的计数,每个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 Server 2005 +