Oracle SQL для возврата значений столбцов из уникальных строк - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть таблица с отдельными партиями, которая может иметь несколько подпартий:

+--------+----------+
¦Batch   +Sub-batch ¦
¦--------¦----------¦
¦B_01    ¦SB_01     ¦
¦B_02    ¦SB_02     ¦
¦B_02    ¦SB_03     ¦
¦B_03    ¦SB_04     ¦
+--------+----------+

Где B_ и SB_ - это только имена (идентификаторы) партий, не требующие агрегирования.

Я хотел бы вернуть:

+--------+-----------+-----------+
¦Batch   +Sub_Batch1 ¦Sub_Batch2 ¦
¦--------¦-----------¦-----------¦
¦B_01    ¦SB_01      ¦           ¦
¦B_02    ¦SB_02      ¦SB_03      ¦
¦B_03    ¦SB_04      ¦           ¦
+--------+-----------+-----------+

Похоже, что PARTITION BY или PIVOT - это путь, но я могу только найти агрегатные функции.

Любая помощь с благодарностью получена!

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Если есть только 2 подпакета, вы можете просто использовать MIN и MAX агрегатные функции следующим образом:

SQL> WITH YOUR_TABLE(Batch, Sub_batch) AS
  2  (SELECT 'B_01', 'SB_01' FROM DUAL UNION ALL
  3  SELECT 'B_02', 'SB_02' FROM DUAL UNION ALL
  4  SELECT 'B_02', 'SB_03' FROM DUAL UNION ALL
  5  SELECT 'B_03', 'SB_04' FROM DUAL)
  6  SELECT
  7      BATCH,
  8      MIN(SUB_BATCH) AS SUB_BATCH1,
  9      CASE
 10          WHEN MIN(SUB_BATCH) <> MAX(SUB_BATCH) THEN MAX(SUB_BATCH)
 11      END AS SUB_BATCH2
 12  FROM YOUR_TABLE
 13  GROUP BY BATCH
 14  ORDER BY BATCH;

BATCH      SUB_BATCH1 SUB_BATCH2
---------- ---------- ----------
B_01       SB_01
B_02       SB_02      SB_03
B_03       SB_04

SQL>

Cheers !!

0 голосов
/ 07 ноября 2019

Вы можете сначала применить row_number() функцию, а затем использовать conditional aggregation:

with t as
(
select t0.*,
       row_number() over (partition by Batch order by Sub_batch) as rn
  from t0
)
select Batch,
       max(case when rn = 1 then Sub_batch end) as Sub_Batch1, 
       max(case when rn = 2 then Sub_batch end) as Sub_Batch2
  from t
 group by Batch
 order by Batch;

Демо

...