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

Tsql T-SQL具有不同where子句的两个计数,tsql,sql-server-2014,Tsql,Sql Server 2014,我想计算具有不同where子句的表上的值,并想知道是否有更好的方法 在这段代码中,我计算了一个值 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的所有行

我想计算具有不同where子句的表上的值,并想知道是否有更好的方法

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

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的所有行 我这样做的方式是这样的子选择

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
该表包含>1亿行,因此我真的需要最快的方式。我在表上使用聚集的列存储索引

是否有一些方法可以在不选择子选项的情况下执行此操作

伪代码:

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
是的,只需使用大小写表达式:

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
;

性能在很大程度上取决于所使用的数据库。在一个系统中速度快的东西不一定在另一个系统中。您使用哪一种?SQL server 2016 Enterprise如果您得到一行或两行,这很重要吗?如果没有,则按您的组织ID和名称分组,其中v.OrganizationID在1,2中