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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

在我看来,这应该与这个表达一致

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

但是这在T-SQL中是不可能的,因为Count()不采用布尔值。那么它真的是用WHERE Value>1COUNT(*)进行多个查询并且之后加入它们的唯一可行方法吗?还是有诀窍来达到预期的效果?

提前致谢。

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

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

另一答案

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

以上是关于T-SQL计算具有特定值的行(在一个查询中多个)的主要内容,如果未能解决你的问题,请参考以下文章

如何对特定列中具有相同值的行求和

聚合具有特定值的两行之间的行

在聚合查询中计算具有特定条件的行

如何提高 SQL Server 查询的性能以选择具有值的行不在子查询中的一次计数

获取具有特定数量的重复值的行

选择联结表中具有多个值的行