Requête SQL comptant le nombre de résultats où différentes conditions sont disponibles

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;