Запрос Oracle, требуется вывод одной строки по идентификатору для нескольких строк (пары имя / значение)

#sql #oracle #name-value

#sql #Oracle #имя-значение

Вопрос:

Я пытался разобраться в этом некоторое время. У меня есть таблица, в которой есть несколько строк, содержащих пары имя-значение, тип и дату (не включены для простоты). Все они связаны идентификатором. Я хотел бы вывести все данные, относящиеся к одному и тому же идентификатору, в одной строке, отфильтрованной по типу equals document.

 ВСТАВИТЬ В таблицу1 
 (идентификатор, имя, значение, тип)
 ЗНАЧЕНИЯ 
 (111, 'направление', 'входящий', 'документ'), 
 (111, 'filename', 'file.txt ', 'document'), 
 (111, 'отправить', 'FOO.SND', 'документ'), 
 (111, 'rec', 'FOO.RCV', 'document'), 
 (111, 'несвязанный', 'несвязанный', 'бизнес'), 
 (222, 'direction', 'inbound2', 'document'), 
 (222, 'filename', 'file2.txt ', 'document'), 
 (222, 'отправить', 'FOO.SND2', 'документ'), 
 (222, 'rec', 'FOO.RCV2', 'document'), 
 (222, 'несвязанный', 'несвязанный2', 'бизнес'), 
 (333, 'direction', 'inbound3', 'document'), 
 (333, 'filename', 'file3.txt ', 'document'), 
 (333, 'отправить', 'FOO.SND3', 'документ'), 
 (333, 'rec', 'FOO.RCV3', 'document'), 
 (333, 'несвязанный', 'несвязанный3', 'бизнес');

То, что я хочу вывести, это:

 направление идентификатора отправить rec filename 
 111 входящий FOO.SND FOO.RCV file.txt 
 222 inbound2 FOO.SND2 FOO.RCV2 file2.txt 
 333 inbound3 FOO.SND3 FOO.RCV3 file3.txt

Ответ №1:

Попробуйте сводный запрос:

 SELECT id,
       MAX(CASE WHEN name = 'direction' THEN val END) AS direction,
       MAX(CASE WHEN name = 'send'      THEN val END) AS send,
       MAX(CASE WHEN name = 'rec'       THEN val END) AS rec,
       MAX(CASE WHEN name = 'filename'  THEN val END) AS filename
FROM table1
GROUP BY id
  

Комментарии:

1. Спасибо! Это помогло подтолкнуть меня в правильном направлении.

2. Извините, поскольку у меня репутация менее 15, это записывается, но не отображается публично. Это сообщение, которое я получил при голосовании.