SQL Server 带集合函数的SQL GROUP BY CASE语句

weylhg0b  于 2022-12-17  发布在  其他
关注(0)|答案(5)|浏览(188)

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

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

我想把它放在我的GROUP BY子句中,但这似乎会引起问题,因为column中有一个聚合函数,在这种情况下,是否有一种方法可以GROUP BY一个列别名,例如some_product,或者我需要把它放在一个子查询中,并对它进行分组?

jogvjijk

jogvjijk1#

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

热膨胀系数:

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 ...
1u4esq0p

1u4esq0p2#

虽然Shannon's answer在技术上是正确的,但它看起来有些矫枉过正。
简单的解决方法是把求和放在case语句之外,这样就可以了:

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

基本上,您的旧代码告诉SQL对每一行单独执行sum(X*Y)(使每一行都有自己的答案,不能分组)。
我写的代码行取和积,这就是你想要的。

amrnrhlw

amrnrhlw3#

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

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语句逐字放在GROUP BY中(减去别名列名)

lzfw57am

lzfw57am4#

如果你用其他的值来分组,那就不用你现有的值,
把它写成

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

如果你想要group By内部表达式,那么(col3*col4)
写入group By以匹配表达式w/o 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
epggiuax

epggiuax5#

在SAS中,我可以在我的聚合表中对一个“case when”列进行GROUP BY。你所要做的就是把“GROUP BY calculated some_product”放在其中。只要把“calculated”和一个空格放在列名前就行了。对我来说很有效。

相关问题