基于一列值组合多行导致单行

问题描述 投票:0回答:2

我想根据称为类型的一列将多行结果合并为单行。

例如,假设我的查询结果如下。

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

我想要的实际结果类似于下表

seqnum  consigneename    shippername
456     transwork         Google2
123     consignee         partyshipper

基本上,当类型为CN时,我想得到类似收货人名称的结果,而当类型为SH时,托运人名称是当结果不是两者时,我可以像其他方一样添加额外的名称列。我可以获得结果并迭代结果集和对象的设置值。但是我认为如果只在查询中获得格式化结果会更好。感谢您的帮助。

oracle oracle11g grouping
2个回答
0
投票

通常这样会有所帮助;第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>

0
投票

我将自己联接表并在联接的每一侧过滤不同的type

SELECT          COALESCE(c.seqnum, s.seqnum) AS seqnum,
                COALESCE(c.name, 'other') AS consigneename,
                COALESCE(s.name, 'other') AS shippername
FROM            mytable c
FULL OUTER JOIN mytable s ON c.seqnum = s.seqnum
WHERE           c.type = 'CN' and s.type = 'SH'
© www.soinside.com 2019 - 2024. All rights reserved.