You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 20:24:04