Bry*_*ard 43 sql sql-server group-by sql-server-2005
我有一个看起来像这样的列:
CASE
WHEN col1 > col2 THEN SUM(col3*col4)
ELSE 0
END AS some_product
Run Code Online (Sandbox Code Playgroud)
我想把它放在我的GROUP BY子句中,但这似乎会导致问题,因为列中有一个聚合函数.是否有一种方法可以将GROUP BY作为列别名,例如some_product
在这种情况下,或者我是否需要将其放在子查询和组中?
Sha*_*nce 51
我的猜测是你真的不想要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 ...
Run Code Online (Sandbox Code Playgroud)
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 ...
Run Code Online (Sandbox Code Playgroud)
小智 36
虽然香农的答案在技术上是正确的,但它看起来有点过分.
简单的解决方案是您需要将总和放在case
声明之外.这应该做的伎俩:
sum(CASE WHEN col1 > col2 THEN col3*col4 ELSE 0 END) AS some_product
Run Code Online (Sandbox Code Playgroud)
基本上,您的旧代码告诉SQL sum(X*Y)
单独执行每一行(让每行都有自己无法分组的答案).
我写的代码行采用了sum产品,这就是你想要的.
如果您按其他值分组,则不是您所拥有的,
写成
Sum(CASE WHEN col1 > col2 THEN SUM(col3*col4) ELSE 0 END) as SumSomeProduct
Run Code Online (Sandbox Code Playgroud)
如果,otoh,你想要group By
内部表达,(col3*col4)
那么
写group By
表达式W /匹配○ 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
Run Code Online (Sandbox Code Playgroud)
最后,如果要按实际聚合分组
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
Run Code Online (Sandbox Code Playgroud)
小智 5
我认为答案很简单(除非我遗漏了什么?)
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
Run Code Online (Sandbox Code Playgroud)
您可以将 CASE STATEMENT 逐字放在 GROUP BY 中(减去别名列名)
归档时间: |
|
查看次数: |
200591 次 |
最近记录: |