SQL如何将UNION查询返回的同主键多行数据转为多列单行展示
问题解决方法
方案1:通用条件聚合(兼容所有主流SQL数据库)
这是适用性最广的实现方式,仅需一次表查询即可得到结果,性能远优于原UNION写法:
SELECT art_nr, MAX(CASE WHEN HIER_FD = 8701 THEN MENG_STK END) AS S01, MAX(CASE WHEN HIER_FD = 8702 THEN MENG_STK END) AS S02, MAX(CASE WHEN HIER_FD = 8703 THEN MENG_STK END) AS S03 FROM NW_ART@MMS_HK WHERE BESTAND_L = 1 AND HIER_FD IN (8701, 8702, 8703) AND art_nr = 43848 GROUP BY art_nr;
实现逻辑:
- 一次拉取符合所有过滤条件的记录
- 通过
CASE WHEN将不同HIER_FD对应的MENG_STK值分配到对应的目标列 - 用
MAX聚合函数提取每个列的有效值,最后按art_nr分组,即可得到单行多列的结果
方案2:Oracle 专用PIVOT语法
如果你使用的是Oracle数据库,可以直接用自带的行转列函数实现:
SELECT * FROM ( SELECT art_nr, HIER_FD, MENG_STK FROM NW_ART@MMS_HK WHERE BESTAND_L = 1 AND HIER_FD IN (8701, 8702, 8703) AND art_nr = 43848 ) PIVOT ( MAX(MENG_STK) FOR HIER_FD IN ( 8701 AS S01, 8702 AS S02, 8703 AS S03 ) );
原写法问题说明
UNION/UNION ALL是纵向合并结果集的语法,要求所有子查询的列数量、数据类型完全一致,最终结果的列名以第一个子查询的别名为准,所以你定义的S02、S03别名不会生效,最终只会返回S01一列的三行数据。
内容的提问来源于stack exchange,提问作者Shadowhunter
相关产品推荐
相关产品推荐

