2011-01-11 90 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 +