J'ai une requête qui ressemble à
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
C'est bien, et me donne un set de résultats avec des noms et des valeurs. Mais ce qui m'importe vraiment, c'est le nombre de problèmes sans la clause WHERE, puis avec juste la condition 1, puis les conditions 1 + 2, puis les conditions 1 + 2 + 3. J'aimerais écrire
SELECT ju.name, COUNT(DISTINCT p.value WHERE <condition 1>) foo, COUNT(DISTINCT p.value WHERE <condition 2>) bar, ...
mais malheureusement je ne peux pas. Est-ce qu'il y a une bonne façon de faire ça?
Vous pouvez utiliser l'expression CASE
pour le faire:
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;
Toutefois: Si vous utilisez un SGBDR prenant en charge l'opérateur de table PIVOT
comme MS SQL Server ou Oracle, vous pouvez l'utiliser directement.
Puisque vous utilisez SQL Server, vous pouvez utiliser l'opérateur de table PIVOT
pour le faire:
SELECT * FROM ( ) AS t PIVOT ( COUNT(value) FOR name IN(...) ) AS p;