質問

次のような列があります:

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top