web-dev-qa-db-ja.com

Group ByでCase Statement列を使用する方法

質問で述べたように、列の結果にcaseステートメントを含むクエリを作成しようとしています。その後、クエリのgroup byステートメントにその列を含めます。具体的な例を挙げると、私のクエリは次のようになります。

SELECT SOME_TABLE_ALIAS.COLUMN1, OTHER_TABLE_ALIAS.COLUMN2,
CASE
    WHEN SOME_TABLE_ALIAS.COLUMN3 IS NOT NULL THEN 'A'
    ELSE 'B'
END AS CASE_COLUMN
FROM SOME_TABLE SOME_TABLE_ALIAS
... (other table joins and where clauses)
GROUP BY SOME_TABLE_ALIAS.COLUMN1, OTHER_TABLE_ALIAS.COLUMN2, CASE_COLUMN

ここに来る前に、 this one を含むいくつかのWebサイトをチェックアウトして、問題を解決しようとしました。リンクされたWebページにCASEキーワードが表示された後に別のエイリアスを追加しようとしましたが、運がありませんでした。引き続き受信するエラーメッセージは次のとおりです。

[Error] Script lines: 127-151 ----------------------
 CASE_COLUMN IS NOT VALID IN THE CONTEXT WHERE IT IS USED. SQLCODE=-206, SQLSTATE=42703, DRIVER=3.53.71 

他の誰かが私が直面している問題に遭遇し、GROUP BYCASEステートメントの結果について?任意の助けをいただければ幸いです。ああ、DB2バージョンはz/OSインスタンス、バージョン10(DSN10015)です

11
butallmj

GROUP BYが発生するとエイリアスがまだ定義されていないため、エイリアスはGROUP BYで使用できません。

Here's the order:
1.FROM
2.WHERE
3.GROUP BY
4.HAVING
5.SELECT
6.ORDER BY

あなたはそれを回避することができます:

SELECT column1,column2,case_column
FROM (
SELECT SOME_TABLE_ALIAS.COLUMN1, OTHER_TABLE_ALIAS.COLUMN2,
CASE
    WHEN SOME_TABLE_ALIAS.COLUMN3 IS NOT NULL THEN 'A'
    ELSE 'B'
END AS CASE_COLUMN
FROM SOME_TABLE SOME_TABLE_ALIAS
... (other table joins and where clauses)
) a
GROUP BY COLUMN1, COLUMN2, CASE_COLUMN

または、GROUP BYのSELECTで使用するケースを使用します

20
Filipe Silva

次のように、group byでのケースをそのまま使用できます。

SELECT SOME_TABLE_ALIAS.COLUMN1, OTHER_TABLE_ALIAS.COLUMN2,
CASE
    WHEN SOME_TABLE_ALIAS.COLUMN3 IS NOT NULL THEN 'A'
    ELSE 'B'
END AS CASE_COLUMN
FROM SOME_TABLE SOME_TABLE_ALIAS
... (other table joins and where clauses)
GROUP BY SOME_TABLE_ALIAS.COLUMN1, OTHER_TABLE_ALIAS.COLUMN2, 
CASE
    WHEN SOME_TABLE_ALIAS.COLUMN3 IS NOT NULL THEN 'A'
    ELSE 'B'
END

または、次のようなサブクエリを使用します。

select COLUMN1, COLUMN2, CASE_COLUMN
from (
    SELECT SOME_TABLE_ALIAS.COLUMN1, OTHER_TABLE_ALIAS.COLUMN2,
    CASE
        WHEN SOME_TABLE_ALIAS.COLUMN3 IS NOT NULL THEN 'A'
        ELSE 'B'
    END AS CASE_COLUMN
    FROM SOME_TABLE SOME_TABLE_ALIAS
    ... (other table joins and where clauses)
) a
GROUP BY COLUMN1, COLUMN2, CASE_COLUMN
7
RedFilter