SQL GROUP BY CASE语句我有一个看起来像这样的列:与聚合函数
CASE
WHEN col1 > col2 THEN SUM(col3*col4)
ELSE 0
END AS some_product
,我希望把它在我的GROUP BY子句,但这似乎导致问题,因为有列中的聚合函数。在这种情况下,有没有办法将GROUP BY列别名(例如some_product
),或者我需要将它放在子查询和组中?
SQL GROUP BY CASE语句我有一个看起来像这样的列:与聚合函数
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 ...
如果你被其他值分组,然后,而不是你有什么,
把它写成
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
虽然Shannon's answer在技术上是正确的,它看起来像矫枉过正。
简单的解决方案是,您需要将您的总和放在case
声明之外。 这应该做的伎俩:
sum(CASE WHEN col1 > col2 THEN col3*col4 ELSE 0 END) AS some_product
基本上,你的旧代码告诉SQL单独执行sum(X*Y)
的每一行(留下有自己的答案各行不能组合)。
我编写的代码行采用总和产品,这是你想要的。
您通过*分组来聚合*。不在*分组。 – gbn 2009-07-30 19:46:15
无论谁高举,这是错误的。尝试一下类似的东西......“给我两个数值相加的总和,按2个其他数值分组,并且还组合我的小组”。 – gbn 2009-07-30 19:48:12
查尔斯编辑后:你的内部查询将只会返回一行,使你的外部分组毫无意义... – gbn 2009-07-30 19:57:18