2011-01-11 14 views
5

ich folgende einfache Abfrage haben,Where-Klausel Zustand auf Aggregatfunktionen

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; 

Wo ich weitere COUNT() Funktionen auf der Auswahlliste hinzugefügt werden soll, sondern verhängen bestimmte, wo die Bedingungen auf sie. Ist das irgendwie mit einer CASE() Anweisung gemacht? Ich habe versucht, Where-Klauseln in die Auswahlliste zu setzen, und das scheint nicht erlaubt zu sein. Ich bin mir nicht sicher, ob Unterabfragen wirklich notwendig sind, aber ich denke nicht.

Zum Beispiel habe ich eine COUNT() Funktion möchten, die nur Probleme in einem bestimmten Bereich zählt, dann noch in einem anderen Bereich oder mit anderen verschiedenen Bedingungen, etc:

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

etc ...

Immer noch nach Logon Name gruppiert.

Danke.

Antwort

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

Nicht 'COUNT' auch zählen '0'? Ich dachte nur "NULL" wurde nicht gezählt. –

+1

@Kirk Woll: Wo sagt COUNT in seiner Antwort? –

+0

Ja, aber Adam zählt nicht, er summt. –

4

Ein paar Lösungen.

Sie können die Vorteile aus der Tatsache ziehen, dass SQL keine Nullwerte GRAF:

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) 
    . . . 

Oder können Sie SUM anstelle von 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) 
    . . . 

In jedem Fall können Sie wiederholen so oft wie du brauchst.

+1

Ich denke, Ihre 'CASE' Ausdrücke sind wahrscheinlich ungültige Syntax, weil es kein' END' gibt. –

+0

Ich denke, Sie haben Recht, Sir. Ich habe gerade die Syntax aktualisiert. Muss aufhören zu hetzen. –

0

Das Beispiel gibt die Anzahl per Benutzer zurück, pro 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 +