Отображение значений LISTAGG в ячейке на основе значения другого столбца - PullRequest
0 голосов
/ 16 мая 2018

Я работаю над заданием, и я очень близок к его завершению, однако некоторое время я боролся с ним.Мне нужно отобразить таблицу, в которой есть столбец SCHEDULE и столбец DAYS, где столбец DAYS показывает список дней на основе SCHEDULE.Для SCHEDULE есть только два варианта: «Выходные» и «День недели».

Вот конечный результат, которого я пытаюсь достичь:

ID   Schedule     Days
001  Weekend      Saturday, Sunday

Я создал процесс, и яиспользуя этот код:

BEGIN
UPDATE schedules
SET days =
        WHEN schedule = 'Weekend' THEN
        (SELECT LISTAGG(day, ', ') WITHIN GROUP (ORDER BY day_order)
        FROM days
        WHERE schedule = 'Weekend'
        )
        WHEN schedule = 'Weekday' THEN
        (SELECT LISTAGG(day, ', ') WITHIN GROUP (ORDER BY day_order)
        FROM days
        WHERE schedule = 'Weekday'
        )
    END

Когда я это делаю, я получаю ошибку:

Обнаружен символ «конец файла» при ожидании одного из следующих действий: началофункция прагма-процедура

Если кто-нибудь может мне помочь, это будет очень ценно!

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Ваше обновление эквивалентно этому.

UPDATE schedules s 
SET    days = (SELECT LISTAGG(day, ', ') 
                        within group ( ORDER BY day_order ) 
               FROM   days d 
               WHERE  d.schedule IN ( 'Weekend', 'Weekday' ) 
                      AND d.schedule = s.schedule 
               GROUP  BY d.schedule ) ;

Но я бы не рекомендовал это.Хранение записей в виде значений, разделенных запятыми, обязательно вызовет проблемы в будущем.Используйте его только для отображения результатов с помощью запроса, как показано ниже.Предполагается, что в вашей таблице дней есть уникальные строки для каждого дня. Если есть дубликаты, join это отдельный набор результатов из дней.

SELECT d.id, 
       d.schedule, 
       LISTAGG(s.day, ', ') 
         within GROUP ( ORDER BY d.day_order ) 
FROM   days d 
       join schedules s 
         ON ( d.schedule = s.schedule ) 
WHERE  d.schedule IN ( 'Weekend', 'Weekday' ) 
GROUP  BY d.id, 
          d.schedule 
0 голосов
/ 16 мая 2018

Вы можете использовать оператор MERGE:

MERGE INTO schedules dst
USING (
  SELECT schedule,
         LISTAGG( day, ', ' ) WITHIN GROUP ( ORDER BY day_order ) AS days
  FROM   days
  GROUP BY schedule
) src
ON ( dst.schedule = src.schedule )
WHEN MATCHED THEN
  UPDATE SET days = src.days;

Но, вероятно, было бы лучше не хранить значения в списке с разделителями, а просто использовать ссылку на внешний ключ между schedules.schedule и days.schedule для соединения двух таблиц.

...