объединить несколько строк результата в одну строку на основе одного значения столбца - PullRequest
1 голос
/ 20 марта 2020

Я хочу объединить несколько результатов строк в одну строку на основе одного столбца, называемого типом.

Например, предположим, у меня ниже результат из моего запроса.

seqnum  type    name
456     SH    Google2
456     CN    transwork
123     SH    partyshipper
123     CN    consignee

Фактический результат i хочу что-то вроде таблицы ниже

seqnum  consigneename    shippername
456     transwork         Google2
123     consignee         partyshipper

В основном я хочу получить результат, как имя получателя, когда тип является CN, и имя грузоотправителя, когда тип является SH, если не оба, то я могу добавить дополнительный столбец с именем так же, как другая сторона. Я могу получить результат и повторить набор результатов и установить значение объекта. но я думаю, что это будет лучше, если мы получим отформатированный результат только в запросе. Спасибо за помощь.

Ответы [ 3 ]

2 голосов
/ 20 марта 2020

Нечто подобное обычно помогает; строки № 1 - 7 представляют ваши данные образца. Код, который вам нужен, начинается со строки № 8.

SQL> with test (seqnum, type, name) as
  2    (select 456, 'SH', 'Google2'      from dual union all
  3     select 456, 'CN', 'transwork'    from dual union all
  4     select 123, 'SH', 'partyshipper' from dual union all
  5     select 123, 'CN', 'consignee'    from dual union all
  6     select 999, 'XX', 'littlefoot'   from dual
  7    )
  8  select seqnum,
  9    max(case when type = 'CN' then name end) consigneename,
 10    max(case when type = 'SH' then name end) shipppername,
 11    max(case when type not in ('CN', 'SH') then name end) otherparty
 12  from test
 13  group by seqnum;

    SEQNUM CONSIGNEENAM SHIPPPERNAME OTHERPARTY
---------- ------------ ------------ ------------
       123 consignee    partyshipper
       999                           littlefoot
       456 transwork    Google2

SQL>
1 голос
/ 20 марта 2020

Заимствование запроса у @Littlefoot. Вы также можете использовать PIVOT для получения ожидаемого результата.

    with test (seqnum, type, name) as
      (select 456, 'SH', 'Google2'      from dual union all
       select 456, 'CN', 'transwork'    from dual union all
       select 123, 'SH', 'partyshipper' from dual union all
       select 123, 'CN', 'consignee'    from dual union all
       select 999, 'OT', 'littlefoot'   from dual
      )
select * from test
pivot (
  min(name) for type in 
      (        
        'SH' shippingname
      , 'CN' consigneename 
      , 'OT' someother
      )
)
;


    SEQNUM SHIPPINGNAME CONSIGNEENAM SOMEOTHER   
---------- ------------ ------------ ------------
       999                           littlefoot  
       456 Google2      transwork                
       123 partyshipper consignee                
0 голосов
/ 20 марта 2020

Я сам присоединяюсь к таблице и фильтрую разные type с каждой стороны объединения:

SELECT          COALESCE(c.seqnum, s.seqnum) AS seqnum,
                COALESCE(c.name, 'other') AS consigneename,
                COALESCE(s.name, 'other') AS shippername
FROM            (SELECT * 
                 FROM   mytable
                 WHERE  type = 'CN') c
FULL OUTER JOIN (SELECT *
                 FROM   mytable
                 WHERE  type = 'SN') s ON c.seqnum = s.seqnum
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...