web-dev-qa-db-fra.com

Comment utiliser la colonne de déclaration de cas dans le groupe par

Comme indiqué par la question, j'essaie de formuler une requête qui a une instruction case dans les résultats de la colonne, puis je veux inclure cette colonne dans l'instruction group by de la requête. Pour donner un exemple concret, voici à quoi ressemble ma requête:

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

Avant de venir ici, j'ai vérifié quelques sites Web, y compris celui-ci , pour essayer de résoudre mon problème. J'ai essayé d'ajouter un autre alias après que le mot clé CASE comme s'affiche dans la page Web liée, mais je n'ai pas eu de chance. Le message d'erreur que je continue de recevoir est le suivant:

[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 

Quelqu'un d'autre a-t-il rencontré les problèmes auxquels je suis confronté et a-t-il pu utiliser un GROUP BY sur les résultats d'une instruction CASE? Toute aide serait appréciée. Oh, et la version DB2 est une instance z/OS, version 10 (DSN10015)

11
butallmj

L'alias n'est pas disponible pour être utilisé dans le GROUP BY car lorsque GROUP BY se produit, l'alias n'est pas encore défini:

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

Vous pouvez contourner cela avec:

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

Ou utilisez simplement le cas que vous utilisez dans SELECT dans GROUP BY

20
Filipe Silva

Vous pouvez soit utiliser le cas tel quel dans le groupe, comme ceci:

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

ou utilisez une sous-requête comme celle-ci:

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