带有聚合函数的SQL GROUP BY CASE语句

Bry*_*ard 43 sql sql-server group-by sql-server-2005

我有一个看起来像这样的列:

CASE
    WHEN col1 > col2 THEN SUM(col3*col4)
    ELSE 0
END AS some_product
Run Code Online (Sandbox Code Playgroud)

我想把它放在我的GROUP BY子句中,但这似乎会导致问题,因为列中有一个聚合函数.是否有一种方法可以将GROUP BY作为列别名,例如some_product在这种情况下,或者我是否需要将其放在子查询和组中?

Sha*_*nce 51

我的猜测是你真的不想要GROUP BYsome_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 ...
Run Code Online (Sandbox Code Playgroud)

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 ... 
Run Code Online (Sandbox Code Playgroud)

  • 这是如何使用CTE的一个很好的例子. (3认同)

小智 36

虽然香农的答案在技​​术上是正确的,但它看起来有点过分.

简单的解决方案是您需要将总和放在case声明之外.这应该做的伎俩:

sum(CASE WHEN col1 > col2 THEN col3*col4 ELSE 0 END) AS some_product
Run Code Online (Sandbox Code Playgroud)

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

我写的代码行采用了sum产品,这就是你想要的.


Cha*_*ana 6

如果您按其他值分组,则不是您所拥有的,

写成

Sum(CASE WHEN col1 > col2 THEN SUM(col3*col4) ELSE 0 END) as SumSomeProduct
Run Code Online (Sandbox Code Playgroud)

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

group By表达式W /匹配○ 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 
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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
Run Code Online (Sandbox Code Playgroud)

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