集計関数を使用したSQL GROUP BY CASEステートメント
-
05-07-2019 - |
質問
次のような列があります:
CASE
WHEN col1 > col2 THEN SUM(col3*col4)
ELSE 0
END AS some_product
それをGROUP BY句に入れたいのですが、列に集計関数があるため、これが問題を引き起こすようです。この場合、 some_product
などの列エイリアスをGROUP BYする方法はありますか、またはこれをサブクエリに入れてグループ化する必要がありますか?
解決
some_productを GROUP BY
にしたくないのではないかと思います。
への回答:"この場合、some_productなどの列エイリアスを GROUP BY
する方法はありますか、これをサブクエリに入れる必要がありますかそしてそれについてグループ化しますか?" is:列のエイリアスを 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 ...
他のヒント
Shannonの答えは技術的には正しいですが、やり過ぎのようです。
簡単な解決策は、合計を case
ステートメントの外側に置く必要があるということです。
これでうまくいくはずです:
sum(CASE WHEN col1 > col2 THEN col3*col4 ELSE 0 END) AS some_product
基本的に、古いコードは、各行に対して個別に sum(X * Y)
を実行するようにSQLに指示します(グループ化できない独自の回答を各行に残します)。
私が書いたコード行は和の積を取りますが、これはあなたが望むものです。
他の値でグループ化する場合、現在の値ではなく、
それを
と書くSum(CASE WHEN col1 > col2 THEN SUM(col3*col4) ELSE 0 END) as SumSomeProduct
もし、あなたが内部式を group By
したいなら、(col3 * col4)
then
SUM
なしの式に一致するように group By
を記述します...
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