Как использовать столбец с описанием случаев в группе

Как указано в вопросе, я пытаюсь сформулировать запрос с аргументом case в результатах столбца, а затем я хочу включить этот столбец в группу запросов по инструкции. Чтобы дать конкретный пример, здесь мало что похоже на мой запрос:

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

Перед тем, как приехать сюда, я проверил несколько веб-сайтов, включая этот, чтобы попытаться решить мою проблему. Я попытался добавить другой псевдоним после того, как ключевое слово 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 BY по результатам инструкции CASE? Любая помощь будет оценена по достоинству. О, и версия DB2 представляет собой экземпляр z/OS, версия 10 (DSN10015)

Ответ 1

Псевдоним недоступен для использования в GROUP BY, потому что когда GROUP BY происходит, псевдоним еще не определен:

Here 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

Или просто используйте случай, который вы используете в SELECT в GROUP BY

Ответ 2

Вы можете использовать случай как есть в группе, например:

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