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

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

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

有帮助吗?

解决方案

我的猜测是你真的不想 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 ... 

其他提示

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

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

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

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

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

如果您按其他值分组,则代替您拥有的值,

将其写为

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

如果,otoh,你想 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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top