我有一个看起来像这样的列:
CASE
WHEN col1 > col2 THEN SUM(col3*col4)
ELSE 0
END AS some_product
我想把它放在我的GROUP BY子句中,但这似乎会导致问题,因为列中有一个聚合函数。在这种情况下,是否有一种方法可以将GROUP BY作为列别名,例如some_product
,或者我是否需要将其放在子查询和组中?
答案 0 :(得分:48)
我的猜测是你真的不想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 ...
答案 1 :(得分:33)
虽然Shannon's answer在技术上是正确的,但看起来有点矫枉过正。
简单的解决方案是您需要将总和放在case
语句之外。
这应该可以解决问题:
sum(CASE WHEN col1 > col2 THEN col3*col4 ELSE 0 END) AS some_product
基本上,您的旧代码告诉SQL单独为每一行执行sum(X*Y)
(让每行都有自己无法分组的答案)。
我写的代码行采用了sum产品,这就是你想要的。
答案 2 :(得分:2)
如果您按其他值分组,则代替您拥有的值,
将其写为
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
答案 3 :(得分:2)
我认为答案很简单(除非我错过了什么?)
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(减去别名列名称)