【问题标题】:SQL GROUP BY CASE statement with aggregate function具有聚合函数的 SQL GROUP BY CASE 语句
【发布时间】:2010-11-15 13:59:23
【问题描述】:

我有一列看起来像这样:

CASE
    WHEN col1 > col2 THEN SUM(col3*col4)
    ELSE 0
END AS some_product

我想把它放在我的 GROUP BY 子句中,但这似乎会导致问题,因为列中有一个聚合函数。在这种情况下,有没有办法 GROUP BY 列别名,例如 some_product,还是我需要将它放在子查询中并对其进行分组?

【问题讨论】:

    标签: sql sql-server sql-server-2005 group-by


    【解决方案1】:

    我的猜测是你真的不想GROUP BY some_product。

    回答:“在这种情况下,有没有办法GROUP BY 列别名,例如 some_product,还是我需要将它放在子查询中并对其进行分组?” 是: 你不能GROUP BY 列别名。

    SELECT 子句在其中分配了列别名,直到 GROUP BY 子句之后才会处理。内联视图或公用表表达式 (CTE) 可用于使结果可用于分组。

    内嵌视图:

    select ...
    from (select ... , CASE WHEN col1 > col2 THEN SUM(col3*col4) ELSE 0 END AS some_product
       from ...
       group by col1, col2 ... ) T
    group by some_product ...
    

    CTE:

    with T as (select ... , CASE WHEN col1 > col2 THEN SUM(col3*col4) ELSE 0 END AS some_product
       from ...
       group by col1, col2 ... )
    select ...
    from T
    group by some_product ... 
    

    【讨论】:

    • 这是如何使用 CTE 的一个很好的例子。
    【解决方案2】:

    虽然Shannon's answer 在技术上是正确的,但看起来有点矫枉过正。

    简单的解决方案是您需要将求和放在case 语句之外。 这应该可以解决问题:

    sum(CASE WHEN col1 > col2 THEN col3*col4 ELSE 0 END) AS some_product
    

    基本上,您的旧代码告诉 SQL 为每一行单独执行 sum(X*Y)(让每一行都有自己的答案,无法分组)。

    我编写的代码行采用 sum product,这就是您想要的。

    【讨论】:

    • 您是否有任何理由不想在 Shannon 的涉及 CTE 的回答中使用此方法?谢谢
    • 对于一般案例陈述,您需要使用香农的答案。这个依赖于 0 的总和为 0。
    • 这是一个非常简单的解决方案,解决问题。
    【解决方案3】:

    如果您是按其他值进行分组,那么不是您所拥有的,

    写成

    Sum(CASE WHEN col1 > col2 THEN SUM(col3*col4) ELSE 0 END) as SumSomeProduct
    

    如果你想group By内部表达式,那么(col3*col4)

    编写group By 以匹配不带SUM 的表达式...

    Select Sum(Case When col1 > col2 Then col3*col4 Else 0 End) as SumSomeProduct
    From ...
    
    Group By Case When col1 > col2 Then col3*col4 Else 0 End 
    

    最后,如果要按实际聚合进行分组

    Select SumSomeProduct, Count(*), <other aggregate functions>
    From (Select <other columns you are grouping By>, 
          Sum(Case When col1 > col2 
              Then col3*col4 Else 0 End) as SumSomeProduct
          From Table
          Group By <Other Columns> ) As Z
    Group by SumSomeProduct
    

    【讨论】:

    • 您聚合一个分组。不在分组。
    • 无论谁投了赞成票,都是错的。自己尝试类似的东西......“给我 2 个值的总和,乘以 2 个其他值,并根据我的组的总和进行分组”。
    • 查尔斯编辑后:您的内部查询只会返回一行,使您的外部分组毫无意义......
    • @gbn,谢谢,是的,我遗漏了他分组依据的其他(隐含)列,但在问题中没有提及...我将进行编辑以更正
    【解决方案4】:

    我认为答案很简单(除非我遗漏了什么?)

    SELECT    
    CASE
        WHEN col1 > col2 THEN SUM(col3*col4)
        ELSE 0
    END AS some_product
    FROM some_table
    GROUP BY
    CASE
        WHEN col1 > col2 THEN SUM(col3*col4)
        ELSE 0
    END
    

    您可以将 CASE STATEMENT 逐字放在 GROUP BY 中(减去别名列名)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-23
      • 2019-02-16
      • 1970-01-01
      • 2012-12-07
      • 2020-10-26
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      相关资源
      最近更新 更多