Oracle SQL实现对手方名称、供应商与客户编号同行展示
问题描述
需要为每个对手方输出一行数据,包含名称、供应商编号(Vendor no.)、**客户编号(Customer no.)**三个独立列,但现有SQL会将每个对手方的两个编号拆分为两行显示(所有编号均存储在value列中),需修改SQL实现预期格式。
原SQL代码:
SELECT par.short_name ,inf.value FROM party_info inf ,party_info_types typ ,party par WHERE inf.type_id = typ.type_id AND inf.party_id = par.party_id AND typ.type_id IN ( 21185 ,21186 ) -- Vendor no / Customer no
解决方案1:条件聚合(兼容所有Oracle版本)
通过CASE WHEN配合聚合函数,将不同类型的编号映射到独立列,同时将旧的隐式连接改为显式JOIN提升代码可读性:
SELECT par.short_name, MAX(CASE WHEN typ.type_id = 21185 THEN inf.value END) AS "Vendor no.", MAX(CASE WHEN typ.type_id = 21186 THEN inf.value END) AS "Customer no." FROM party_info inf JOIN party_info_types typ ON inf.type_id = typ.type_id JOIN party par ON inf.party_id = par.party_id WHERE typ.type_id IN (21185, 21186) GROUP BY par.short_name;
说明:CASE WHEN会筛选出对应类型ID的编号值,MAX(或MIN,因每个对手方对应单类型编号最多一条数据)聚合后可将两行数据合并为一行。
解决方案2:使用PIVOT(Oracle 11g及以上版本)
利用Oracle原生的PIVOT语法实现行转列,代码更简洁:
SELECT short_name, "21185" AS "Vendor no.", "21186" AS "Customer no." FROM ( SELECT par.short_name, typ.type_id, inf.value FROM party_info inf JOIN party_info_types typ ON inf.type_id = typ.type_id JOIN party par ON inf.party_id = par.party_id WHERE typ.type_id IN (21185, 21186) ) PIVOT ( MAX(value) FOR type_id IN (21185, 21186) );
说明:子查询先获取包含名称、类型ID、编号值的基础数据,再通过PIVOT将不同类型ID的行转为独立列,MAX聚合确保每个对手方对应唯一值。
内容的提问来源于stack exchange,提问作者Skywalker
相关产品推荐
相关产品推荐

