Конвертировать строки в столбцы в одном SQL, но не влиять на число строк - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть таблица, ее структура и данные выглядят так:
enter image description here

тогда я хочу, чтобы SQL преобразовал его так:
enter image description here

Я действительно не знаю, как написать SQL для выполнения этой функции, кто-нибудь может мне помочь? Я ссылался на множество предыдущих ответов по этой теме, но не могу найти ни одного для своего случая. кто-нибудь может мне помочь, пожалуйста.

1 Ответ

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

Вы можете сделать это с иерархическим запросом, если у вас есть только три уровня для рассмотрения:

SQL Fiddle

Настройка схемы Oracle 11g R2 :

CREATE TABLE table_name ( LineItem_Name, LineItem_Id, parent_id, dept_name, product_name ) AS
  SELECT 'ABC', 1, NULL, 'D1', 'P1' FROM DUAL UNION ALL
  SELECT 'CDF', 2,    1, 'D2', 'P2' FROM DUAL UNION ALL
  SELECT 'EFG', 3,    1, 'D3', 'P3' FROM DUAL UNION ALL
  SELECT 'HIJ', 4,    2, 'D4', 'P4' FROM DUAL;

Запрос 1 :

SELECT CONNECT_BY_ROOT( LineItem_Name) AS LineItem_Level1,
       CASE LEVEL
       WHEN 3 THEN PRIOR LineItem_Name
       WHEN 2 THEN LineItem_Name
       END AS LineItem_Level2,
       CASE LEVEL
       WHEN 3 THEN LineItem_Name
       END AS LineItem_Level3,
       dept_name,
       product_name
FROM   table_name
START WITH parent_id IS NULL
CONNECT BY PRIOR LineItem_ID = parent_id

Результаты :

| LINEITEM_LEVEL1 | LINEITEM_LEVEL2 | LINEITEM_LEVEL3 | DEPT_NAME | PRODUCT_NAME |
|-----------------|-----------------|-----------------|-----------|--------------|
|             ABC |          (null) |          (null) |        D1 |           P1 |
|             ABC |             CDF |          (null) |        D2 |           P2 |
|             ABC |             CDF |             HIJ |        D4 |           P4 |
|             ABC |             EFG |          (null) |        D3 |           P3 |

Запрос 2 : это альтернатива, использующая рекурсивный факторинг подзапроса, который получит прародителя и родителя текущей позиции;который немного отличается от предыдущего запроса, но для 3 уровней даст тот же результат.

WITH tree ( id, grandparent, parent, item, dept_name, product_name ) AS (
  SELECT LineItem_id,
         NULL,
         NULL,
         LineItem_name,
         dept_name,
         product_name
  FROM   table_name
  WHERE  parent_id IS NULL
UNION ALL
  SELECT t.lineItem_id,
         p.parent,
         p.item,
         t.lineItem_name,
         t.dept_name,
         t.product_name
  FROM   tree p
         INNER JOIN
         table_name t
         ON ( p.id = t.parent_id )
)
SELECT COALESCE( grandparent, parent, item ) AS LineItem_Level1,
       CASE
       WHEN parent IS NULL THEN NULL
       WHEN grandparent IS NULL THEN item
       ELSE parent
       END AS LineItem_Level2,
       NVL2( grandparent, item, NULL ) AS LineItem_Level3,
       dept_name,
       product_name
FROM   tree

Результаты :

| LINEITEM_LEVEL1 | LINEITEM_LEVEL2 | LINEITEM_LEVEL3 | DEPT_NAME | PRODUCT_NAME |
|-----------------|-----------------|-----------------|-----------|--------------|
|             ABC |          (null) |          (null) |        D1 |           P1 |
|             ABC |             CDF |          (null) |        D2 |           P2 |
|             ABC |             EFG |          (null) |        D3 |           P3 |
|             ABC |             CDF |             HIJ |        D4 |           P4 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...