5

我有一个看起来像的查询

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

这很好,并给了我一个包含名称和值的结果集。但我真正关心的是没有 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,
...

但遗憾的是我不能。有这样做的好方法吗?

4

1 回答 1

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;

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


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

SELECT *
FROM 
(
) AS t
PIVOT
(
   COUNT(value)
   FOR name IN(...)
) AS p;
于 2013-03-19T11:28:47.487 回答