【问题标题】:T-SQL Count rows with specific values (Multiple in one query)T-SQL 计算具有特定值的行(多合一查询)
【发布时间】:2011-03-12 17:59:22
【问题描述】:

我需要一些有关 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(*) 进行多个查询并在之后加入它们的唯一可能方法吗?或者有什么技巧可以达到预期的效果?

提前致谢。

【问题讨论】:

    标签: tsql count


    【解决方案1】:
    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
    

    【讨论】:

    • 根据我的经验,SQL Server 可以很好地使用这个命令。
    【解决方案2】:

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

    【讨论】:

    • 这行不通。所有非空值都包含在计数中。
    • @HoseynHeydari 不,检查编辑,我更正了,示例现在是正确的。如果 SO 上的答案有误,则将其删除。
    【解决方案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 
    

    【讨论】:

    • 谢谢,我怎么没想到。
    • 这行不通。所有非空值都包含在计数中。
    • 我不是这个意思。您的CASE 语句返回10,这意味着COUNT 在任何一种情况下都会递增。当您不希望计数增加时,您的 CASE 语句应返回 NULL
    【解决方案4】:
    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 的比例存在的值非常有帮助。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        你也可以使用:

        select
        count(nullif(field > minvalue,false))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-03-12
          • 1970-01-01
          • 2018-08-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-28
          • 1970-01-01
          相关资源
          最近更新 更多