2013-03-19 8 views
5

Ho una domanda che sembraquery SQL contando il numero di risultati in cui le condizioni diverse tenere

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 

Questo va bene, e mi dà un set di risultati con i nomi e valori. Ma quello che mi interessa davvero è il numero di problemi senza la clausola WHERE, quindi con la condizione 1, quindi le condizioni 1 + 2, quindi le condizioni 1 + 2 + 3. Mi piacerebbe scrivere

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

ma purtroppo non posso. C'è un bel modo per farlo?

+0

+1 bella domanda: come suggerito Mahmoud - provare a utilizzare 'CASE' nel' select' clausola e sbarazzarsi del 'WHERE' – whytheq

risposta

4

È possibile utilizzare l'espressione CASE di farlo:

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; 

Tuttavia: Se si utilizza un RDBMS che supporta l'operatore PIVOT tavolo come MS SQL Server o Oracle, è possibile utilizzarlo per fare quindi, direttamente.


Dal momento che si utilizza SQL Server, è possibile utilizzare l'operatore PIVOT tavolo per farlo:

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

Impressionante, grazie. Sto davvero usando MS SQL Server - non sono sicuro di vedere cosa mi piacerebbe fare. Potresti fare un esempio? – katrielalex

+0

@katrielalex - Dipende, posto solo un semplice pseudo codice su come farlo, ma ci sono altre varianti. Potete per favore postare alcuni dati di esempio dalle due tabelle con l'output desiderato? sarà utile. –

Problemi correlati