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

时间:2010-07-07 10:13:15

标签: tsql count

我需要一些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

在我看来,应该使用这个表达式

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

但是这在T-SQL中是不可能的,因为Count()不采用布尔值。 那么它是否真的是使用WHERE Value>1COUNT(*)进行多个查询并在之后加入的唯一可能方式?或者有一个技巧可以达到预期的效果吗?

提前致谢。

6 个答案:

答案 0 :(得分:68)

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

答案 1 :(得分:10)

您可以使用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 

答案 2 :(得分:3)

利用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 

答案 3 :(得分:2)

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个不同值,如上所示进行微小更改。

非常有助于验证应该以1:1的比例存在的值。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

您还可以使用:

array([[1]])