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

如何将同一数据表的多行数据转换为单行多列?附SQL尝试代码

解决将多行数据表转为单行返回的问题

你找的方向完全没错——用CASE语句做行转列是这类需求的常规操作,但现在的写法会因为每条记录单独返回,导致结果里出现大量NULL值,没法合并成单行。只需要加上聚合函数和分组就能搞定!

先看看你的原始尝试:

SELECT od.OrderNo,
CASE WHEN od.PartNo LIKE 'CAD%' THEN od.PartNo END AS [Part1],
CASE WHEN od.PartNo LIKE 'CAD%' THEN od.DueDate END AS [DueDate1],
CASE WHEN od.PartNo LIKE 'WISH%' THEN od.PartNo END AS [Part2],
CASE WHEN od.PartNo LIKE 'WISH%' THEN od.DueDate END AS [DueDate2]
FROM OrderDet od
WHERE od.OrderNo = '20352E' AND ...

你需要用MAX()(如果每个前缀对应唯一记录,用MIN()效果也一样)把每个CASE的结果聚合起来,再通过GROUP BY把同一个订单的行合并成一行。修改后的代码如下:

SELECT 
    od.OrderNo, 
    MAX(CASE WHEN od.PartNo LIKE 'CAD%' THEN od.PartNo END) AS [Part1], 
    MAX(CASE WHEN od.PartNo LIKE 'CAD%' THEN od.DueDate END) AS [DueDate1], 
    MAX(CASE WHEN od.PartNo LIKE 'WISH%' THEN od.PartNo END) AS [Part2], 
    MAX(CASE WHEN od.PartNo LIKE 'WISH%' THEN od.DueDate END) AS [DueDate2] 
FROM OrderDet od 
WHERE od.OrderNo = '20352E' 
GROUP BY od.OrderNo;

为什么这么改?

  • 聚合函数MAX()会自动忽略NULL值,只保留每个CASE条件下的有效非空数据
  • GROUP BY od.OrderNo确保整个查询只为目标订单返回一行结果

如果之后还有其他类似前缀的分类(比如ABC%),只需要继续添加对应的MAX(CASE...)字段就行,扩展性很强。要是前缀是动态不固定的,那可能需要用到动态SQL,但针对你现在的固定场景,上面的写法完全够用啦。

内容的提问来源于stack exchange,提问作者user1452574

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:09:42