Как использовать оператор case и min () с group by? - PullRequest
1 голос
/ 06 мая 2020

Следующий запрос, когда я выполняю

SELECT CASE
         WHEN spd.IS_MAIN_DEFECT='Y' 
           THEN spd.piece_Defect_num_id 
         ELSE min(spd.PIECE_DEFECT_NUM_ID)
       END AS defect
  FROM piece P,
       STY_PIECE_DEFECT spd,
       STY_DEFECT_CATALOGUE sdc,
       piece_history ph,
       piece_history_out pho,
       PLANT_CONFIG pc
  (...inner join and where clause)
  GROUP BY p.PIECE_ID,
           CASE
             WHEN spd.IS_MAIN_DEFECT='Y'
               THEN spd.piece_Defect_num_id
             ELSE min(spd.PIECE_DEFECT_NUM_ID)
           end 

Кажется ошибка

ORA-00934: групповая функция здесь не разрешена

Думаю, есть ошибка min () в группе by.

Как решить эту проблему?

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Вы должны использовать analytical MIN() функцию, как показано ниже without group by

     SELECT distinct CASE WHEN spd.IS_MAIN_DEFECT='Y' 
      THEN spd.piece_Defect_num_id 
       ELSE min(spd.PIECE_DEFECT_NUM_ID) over () END AS defect
      FROM piece P , STY_PIECE_DEFECT spd ,STY_DEFECT_CATALOGUE sdc ,piece_history ph 
      , piece_history_out pho, PLANT_CONFIG pc
      (...inner join and where clause)
0 голосов
/ 06 мая 2020

Я понял, что вы хотите сохранить PIECE_DEFECT_NUM_ID в строках с IS_MAIN_DEFECT = 'Y' и получить значение MIN для неосновных строк дефекта.

Простейшее решение для в случае есть только одна строка на PIECE_ID с IS_MAIN_DEFECT = 'Y' - вы группируете PIECE_ID, IS_MAIN_DEFECT и вычисляете min(PIECE_DEFECT_NUM_ID)

, что отлично MIN для одной группы строк равно исходному значению

select PIECE_ID,IS_MAIN_DEFECT,
min(PIECE_DEFECT_NUM_ID) PIECE_DEFECT_NUM_ID
from tab
group by PIECE_ID, IS_MAIN_DEFECT
order by 1,2 desc;

В случае, если у вас может быть больше строк (тот же PIECE_ID) с основным флагом, просто выберите их разгруппированными и добавьте сгруппированные не- основная часть с использованием UNION ALL

select PIECE_ID,IS_MAIN_DEFECT,PIECE_DEFECT_NUM_ID
from tab
where IS_MAIN_DEFECT = 'Y'
UNION ALL
select PIECE_ID,IS_MAIN_DEFECT,
min(PIECE_DEFECT_NUM_ID) PIECE_DEFECT_NUM_ID
from tab
where nvl(IS_MAIN_DEFECT,'N') != 'Y'
group by PIECE_ID, IS_MAIN_DEFECT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...