繁体   English   中英

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

[英]SQL GROUP BY CASE statement with aggregate function

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

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

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

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

这个问题答案:“有没有办法GROUP BY列别名,如在这种情况下some_product,或者我需要把这个在一个子查询和组吗?” 是:您不能GROUP BY列别名。

GROUP BY子句之后才处理分配列别名的SELECT子句。 内联视图或公用表表达式 (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 ... 

虽然香农的回答在技​​术上是正确的,但它看起来有点矫枉过正。

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

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

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

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

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

写成

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

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

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 中(减去别名列名)

在 SAS 中,我可以对聚合表中的“case when”列进行 GROUP BY。 您所要做的就是放置“GROUP BY calculated some_product”。 只需在列名前放置“已计算”和一个空格。 为我工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM