2013-03-19 3 views
5

halten Ich habe eine Abfrage, die SQL-Abfrage der Anzahl der Ergebnisse zu zählen, wo verschiedene Bedingungen

SELECT ju.name, 
    COUNT(DISTINCT p.value) AS nproblems 
FROM #problems p 
JOIN <thing> ju ON <whatever> 
WHERE <condition 1> 
    AND <condition 2> 
    AND <condition 3> 
GROUP BY ju.name 
ORDER BY nproblems DESC 

Das ist in Ordnung, wie

aussieht, und gibt mir ein Ergebnis mit Namen und Werten gesetzt. Aber was mich wirklich interessiert, ist die Anzahl der Probleme ohne die WHERE-Klausel, dann mit nur Bedingung 1, dann Bedingungen 1 + 2, dann Bedingungen 1 + 2 + 3. Ich würde gerne schreiben

SELECT ju.name, 
    COUNT(DISTINCT p.value WHERE <condition 1>) foo, 
    COUNT(DISTINCT p.value WHERE <condition 2>) bar, 
... 

aber leider kann ich nicht. Gibt es eine nette Möglichkeit, dies zu tun?

+0

+1 schöne Frage: wie Mahmoud vorgeschlagen - versuchen Sie es mit 'CASE' im' SELECT' Klausel und loswerden der 'WHERE' – whytheq

Antwort

4

Sie können mit den CASE Ausdruck so tun:

SELECT ju.name, 
    SUM(CASE WHEN <condition 1> THEN 1 ELSE 0 END) AS foo, 
    SUM(CASE WHEN <condition 1> THEN 1 ELSE 0 END) AS bar, 
    ... 
FROM #problems p 
JOIN <thing> ju ON <whatever> 
GROUP BY ju.name 
ORDER BY nproblems DESC; 

jedoch: Wenn Sie ein RDBMS verwenden, die die PIVOT Tabelle Operator wie MS SQL Server oder Oracle unterstützt, können Sie es tun Also, direkt.


Da Sie SQL Server verwenden, können Sie die PIVOT Tabelle Operator verwenden, dies zu tun:

SELECT * 
FROM 
(
) AS t 
PIVOT 
(
    COUNT(value) 
    FOR name IN(...) 
) AS p; 
+1

Ehrfürchtig, danke. Ich benutze tatsächlich MS SQL Server - nicht sicher, ich sehe was ich drehen würde. Kannst du ein Beispiel geben? – katrielalex

+0

@katrielalex - Es kommt darauf an, ich poste nur einen einfachen Pseudo-Code, wie man das macht, aber es gibt andere Variationen. Können Sie bitte einige Beispieldaten aus den beiden Tabellen mit der gewünschten Ausgabe posten? es wird hilfreich sein. –

Verwandte Themen