#sql #oracle-sqldeveloper
#sql #oracle-sqldeveloper
Вопрос:
Я запускаю этот запрос в sql developer, я хочу подсчитать количество всех дат, когда были сделаны РЕГИСТРАЦИИ, и я хочу использовать NVL2 для возврата YES, если yes, NO, если на эту дату не было сделано РЕГИСТРАЦИЙ.
Oracle выдает мне следующую ошибку «NOT A GROUPY BY ВЫРАЖЕНИЕ»
Не могли бы вы мне помочь, пожалуйста?
Спасибо!
SELECT
NVL2(FA.IDDT_REGISTRATION,'YES','NO') AS REGISTRATION,
COUNT(1),
DATA
FROM L_TIME LT
LEFT JOIN F_REGISTRATION FA ON LT.IDDT=FA.IDDT_REGISTRATION
WHERE ID_YEAR='2017'
GROUP BY DATA
ORDER BY DATA
Комментарии:
1. Вы запрашиваете у Oracle
GROUP BY
DATA
столбец by, но также запрашиваетеFA.IDDT_REGISTRATION
столбец без функции агрегирования. Поэтому он запутался с тем, что с ним делать.2. большое вам спасибо! Я понимаю ошибку
Ответ №1:
Кажется, вам может понадобиться какая-то условная агрегация, возможно:
SELECT
DATA,
COUNT(FA.IDDT_REGISTRATION) AS YES_CNT,
COUNT(CASE WHEN FA.IDDT_REGISTRATION IS NULL THEN 1 END) AS NO_CNT
FROM L_TIME LT
LEFT JOIN F_REGISTRATION FA ON LT.IDDT = FA.IDDT_REGISTRATION
WHERE
ID_YEAR = '2017'
GROUP BY
DATA
ORDER BY
DATA;
Ответ №2:
Вы не хотите использовать NVL2
для этого. Вы хотите использовать CASE
:
SELECT (CASE WHEN COUNT(FA.IDDT_REGISTRATION) = 0 THEN 'YES' ELSE 'NO' END) AS REGISTRATION,
COUNT(1),
LT.DATA
FROM L_TIME LT LEFT JOIN
F_REGISTRATION FA
ON LT.IDDT = FA.IDDT_REGISTRATION
WHERE LT.ID_YEAR = '2017'
GROUP BY LT.DATA
ORDER BY DATA;
Если вы действительно настроены на NVL2()
это, вы можете сформулировать это как:
SELECT NVL2(NULLIF(COUNT(FA.IDDT_REGISTRATION), 0), 'YES', 'NO') AS REGISTRATION,