T-SQL计算具有特定值的行(多个在一个查询中)

我可能需要一些T-SQL查询的帮助。 我想要计算具有特殊价值的字段(例如> 1)。

假设我有一个表像

IGrp | Item | Value1 | Value2 ############################# A | I11 | 0.52 | 1.18 A | I12 | 1.30 | 0.54 A | I21 | 0.49 | 2.37 B | I22 | 2.16 | 1.12 B | I31 | 1.50 | 0.28 

我想要一个结果

 IGrp | V1High | V2High ###################### A | 1 | 2 B | 2 | 1 

在我看来,这应该与这个expression

 SELECT IGrp, COUNT(Value1>1) AS V1High, COUNT(Value2>1) AS V2High FROM Tbl GROUP BY IGrp 

但是这在T-SQL中是不可能的,因为Count()不采用布尔值。 那么是否真的有唯一可能的方法来做WHERE Value>1COUNT(*)多个查询,然后join呢? 还是有一个技巧来实现预期的结果?

提前致谢。

 SELECT IGrp, COUNT(CASE WHEN Value1 > 1 THEN 1 ELSE NULL END) AS V1High, COUNT(CASE WHEN Value2 > 1 THEN 1 ELSE NULL END) AS V2High FROM Tbl GROUP BY IGrp 

您可以使用CASE语句:

 SELECT IGrp, SUM(CASE WHEN Value1>1 THEN 1 ELSE 0 END) AS V1High, SUM(CASE WHEN Value2>1 THEN 1 ELSE 0 END) AS V2High FROM Tbl GROUP BY IGrp 

利用case when会为你工作

 SELECT IGrp, sum(case when isnull(Value1,0)>1 then 1 else 0 end) AS V1High, sum(case when isnull(Value2,0)>1 then 1 else 0 end) AS V2High FROM Tbl GROUP BY IGrp 
 SELECT IGrp, COUNT(CASE WHEN Value1 = 'Foo' THEN 1 ELSE NULL END) AS Tot_Foo, COUNT(CASE WHEN Value1 = 'Blah' THEN 1 ELSE NULL END) AS Tot_Blah FROM Tbl GROUP BY IGrp 

这也可以用来比较同一个字段的2个不同的值,如上所示。

对于validation应该以1:1比例存在的值非常有帮助。

你可以把CASE .. WHEN ..语句放在COUNT()函数内,当条件成立时返回1,否则返回NULL。