Запрос на объединение нескольких записей в одну запись с несколькими столбцами в Oracle - PullRequest
0 голосов
/ 24 сентября 2018

У меня проблема с тем, чтобы сделать несколько записей одной записью с несколькими столбцами в Oracle.Это мой запрос:

SELECT cnim, ckddos FROM  tjadsidangast j, tsidangast s 
WHERE j.cnojadwal=s.cnojadwal AND cnim='1111500003'

результат:

+------------+--------+
|  CNIM      | CKDDOS |
+------------+--------+
| 1111500003 |  00105 |
| 1111500003 |  00060 |
| 1111500003 |  00126 |
+------------+--------+

Я пробовал этот запрос:

SELECT cnim,
   LTRIM(MAX(SYS_CONNECT_BY_PATH(ckddos,','))
   KEEP (DENSE_RANK LAST ORDER BY curr),',') AS elements
FROM   (SELECT cnim,
           ckddos,
           ROW_NUMBER() OVER (PARTITION BY cnim ORDER BY cstatus) AS curr,
           ROW_NUMBER() OVER (PARTITION BY cnim ORDER BY cstatus) -1 AS prev
    FROM   tsidangast j, tjadsidangast s WHERE j.cnojadwal=s.cnojadwal AND 
cnim='1111500003')
GROUP BY cnim
CONNECT BY prev = PRIOR curr AND cnim = PRIOR cnim
START WITH curr = 1;

результат:

+------------+---------------------+
|     CNIM   |  ELEMENTS           |
+------------+---------------------+
| 1111500003 |  00126,00105,00060  |
+------------+---------------------+

мой вопрос: как я могу сделать так, чтобы результат стал таким:

+------------+--------+-------+-------+
|     CNIM   |    MD  |  P1   |  P2   |
+------------+--------+-------+-------+
| 1111500003 |  00126 | 00105 | 00060 |
+------------+--------+-------+-------+

спасибо

1 Ответ

0 голосов
/ 24 сентября 2018

Вместо медленного (и здесь ненужного) иерархического запроса используйте pivot:

SQLFiddle demo

select * 
  from (select row_number() over (order by cstatus) rn, cnim, ckddos
          from your_join
          where cnim = '1111500003')
  pivot (max(ckddos) for rn in (1 md, 2 p1, 3 p2))

Если это версия Oracle 10 или ниже, замените pivot на max(case ...):

Демонстрация SQLFiddle

select cnim, 
       max(case when rn = 1 then ckddos end) md, 
       max(case when rn = 2 then ckddos end) p1,
       max(case when rn = 3 then ckddos end) p2 
  from (
    select row_number() over (order by cstatus) rn, cnim, ckddos
      from your_join
      where cnim = '1111500003')
  group by cnim

Это решение похоже на @ D-Shih, но вы не должны жестко кодировать ckddos значения в запросе, потому что это то, что вы ищете.Что вы должны и можете жестко закодировать - это номера строк (1, 2, 3).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...