T-SQL 具有不同 where 子句的两个计数

T-SQL Two counts with different where clause

我想用不同的 where 子句计算 table 上的值,想知道是否有更好的方法。

在这段代码中,我计算了一个值。

SELECT v.name, count(v.value) AS v1
FROM dbo.table as v
WHERE v.organisationID = 2
AND v.datecreated > '2018-01-01'
AND v.datecreated < '2018-05-01'
AND v.value = 1
GROUP BY v.name

我还想计算值 = 2 的所有行 我的做法是使用 sub select.

SELECT v.name, count(v.value) AS v1, (SELECT v2.name, count(v2.value)  
FROM dbo.table as v2
WHERE v2.organisationID = 2
AND v2.datecreated > '2018-01-01'
AND v2.datecreated < '2018-05-01'
AND v2.value = 2
GROUP BY v2.name) AS v2
FROM dbo.table as v
WHERE v.organisationID = 2
AND v.datecreated > '2018-01-01'
AND v.datecreated < '2018-05-01'
AND v.value = 1
GROUP BY v.name

table 包含 > 1 亿行,所以我真的想要最快的方法。我在 table.

上使用聚集列存储索引

有没有什么方法可以不用 sub-select。

伪代码:

SELECT v.name, count(v.value where v.value=1) AS v1, count(v.value where v.value=2) AS v2
FROM dbo.table as v
WHERE v.organisationID = 2
AND v.datecreated > '2018-01-01'
AND v.datecreated < '2018-05-01'
GROUP BY v.name

是的,只需使用 CASE 表达式:

SELECT  v.name, 
        SUM(CASE WHEN v.value = 1 THEN 1 ELSE 0 END) AS v1,
        SUM(CASE WHEN v.value = 2 THEN 1 ELSE 0 END) AS v2
FROM dbo.table as v
WHERE v.organisationID = 2
AND v.datecreated > '2018-01-01'
AND v.datecreated < '2018-05-01'
AND v.value IN (1,2)
GROUP BY v.name
;