2009-07-30 197 views
34

SQL GROUP BY CASE语句我有一个看起来像这样的列:与聚合函数

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

,我希望把它在我的GROUP BY子句,但这似乎导致问题,因为有列中的聚合函数。在这种情况下,有没有办法将GROUP BY列别名(例如some_product),或者我需要将它放在子查询和组中?

回答

41

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

如果你被其他值分组,然后,而不是你有什么,

把它写成

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 
+0

您通过*分组来聚合*。不在*分组。 – gbn 2009-07-30 19:46:15

+0

无论谁高举,这是错误的。尝试一下类似的东西......“给我两个数值相加的总和,按2个其他数值分组,并且还组合我的小组”。 – gbn 2009-07-30 19:48:12

+0

查尔斯编辑后:你的内部查询将只会返回一行,使你的外部分组毫无意义... – gbn 2009-07-30 19:57:18

27

虽然Shannon's answer在技术上是正确的,它看起来像矫枉过正。

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

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

基本上,你的旧代码告诉SQL单独执行sum(X*Y)的每一行(留下有自己的答案各行不能组合)。

我编写的代码行采用总和产品,这是你想要的。