2013-03-19 9 views
5

Mam kwerendę, która wygląda jakzapytań SQL licząc liczbę wyników, gdzie różne warunki trzymać

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 

To jest w porządku, i daje mi zestaw wyników z nazwami i wartościami. Ale tak naprawdę zależy mi na liczbie problemów bez klauzuli WHERE, a następnie z warunkiem 1, a następnie warunkami 1 + 2, a następnie warunkami 1 + 2 + 3. Chciałbym napisać:

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

, ale niestety nie mogę. Czy jest to dobry sposób na zrobienie tego?

+0

+1 ładny pytanie: jak sugeruje Mahmoud - spróbuj użyć 'CASE' w' SELECT' i pozbądź się "GDZIE" – whytheq

Odpowiedz

4

Można użyć wyrażenia CASE zrobić tak:

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; 

Jednakże: Jeśli używasz RDBMS, który obsługuje operator PIVOT stole jak MS SQL Server lub Oracle, można go użyć do zrobienia więc, bezpośrednio.


Ponieważ używasz SQL Server, można użyć operatora PIVOT stołowego, aby to zrobić:

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

Niesamowite, dzięki. Rzeczywiście używam serwera MS SQL - nie jestem pewny, czy zobaczę, co chciałbym przestawić. Czy mógłbyś podać przykład? – katrielalex

+0

@katrielalex - Zależy od tego, publikuję prosty pseudo kod, jak to zrobić, ale są też inne odmiany. Czy możesz przesłać niektóre przykładowe dane z dwóch tabel z żądanym wyjściem? to będzie pomocne. –