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>1
和COUNT(*)
多个查询,然后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。