Search code examples
sqloraclepivotanalytic-functions

Oracle SQL to return column values from unique rows


I have a table with individual batches which can have multiple sub-batches:

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

Where B_ and SB_ are only names (identifiers) of batches, requiring no aggregation.

I would like to return:

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

It looks like PARTITION BY or PIVOT is the way to go but I can only seem to find aggregate functions.

Any help gratefully received!


Solution

  • If there are only 2 sub_batches then you can simply use MIN and MAX aggregate functions as following:

    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!!