SQL查询计算不同条件所持有的结果数

Kat*_*iel 5 sql sql-server conditional-statements

我有一个看起来像的查询

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
Run Code Online (Sandbox Code Playgroud)

这很好,并给我一个名称和值的结果集.但我真正关心的是没有WHERE子句的问题数,然后只有条件1,然后条件1 + 2,然后条件1 + 2 + 3.我想写

SELECT ju.name,
    COUNT(DISTINCT p.value WHERE <condition 1>) foo,
    COUNT(DISTINCT p.value WHERE <condition 2>) bar,
...
Run Code Online (Sandbox Code Playgroud)

但遗憾的是我做不到.有这么好的方法吗?

Mah*_*mal 4

您可以使用CASE表达式来执行此操作:

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;
Run Code Online (Sandbox Code Playgroud)

但是:如果您使用的是支持表运算符的 RDBMS PIVOT(例如 MS SQL Server 或 Oracle),则可以直接使用它来执行此操作。


由于您使用的是 SQL Server,因此可以使用PIVOT表运算符来执行此操作:

SELECT *
FROM 
(
) AS t
PIVOT
(
   COUNT(value)
   FOR name IN(...)
) AS p;
Run Code Online (Sandbox Code Playgroud)