我想根据称为类型的一列将多行结果合并为单行。
例如,假设我的查询结果如下。
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时,托运人名称是当结果不是两者时,我可以像其他方一样添加额外的名称列。我可以获得结果并迭代结果集和对象的设置值。但是我认为如果只在查询中获得格式化结果会更好。感谢您的帮助。
通常这样会有所帮助;第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>
我将自己联接表并在联接的每一侧过滤不同的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'