проблемы с предложениями NVL и GROUP BY

#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,