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

SQL子查询场景下合并多行结果为单行并添加计算列的方法问询

解决多行转单行的SQL聚合问题

你的问题核心是关联表后产生了多行结果,需要将同一ID的多条记录按指定条件聚合为单行,同时还要添加计算列。下面分两步给你解决方案:

第一步:将多行合并为单行(取各列最大值)

你当前的查询返回多行,是因为LEFT JOIN MITAUN后,每个MMITNO对应了多条MITAUN的记录,而原有的子查询没有和主表的MMITNO关联,导致逻辑混乱。我们可以用CASE表达式配合MAX()聚合函数,直接在关联后的结果上提取符合条件的值,并按MMITNO分组:

SELECT 
    MMITNO, 
    MAX(CASE WHEN ALUN='PCE' AND DMCF='2' THEN COFA END) AS EAperCSE, 
    MAX(CASE WHEN ALUN='PAL' AND DMCF='1' THEN COFA END) AS CSEperPAL, 
    MAX(CASE WHEN ALUN='LAY' AND DMCF='1' THEN COFA END) AS CSEperLAY
FROM MVXJDTA.MITMAS 
LEFT JOIN MVXJDTA.MITAUN ON MUITNO = MMITNO
GROUP BY MMITNO

逻辑说明:

  • CASE表达式会筛选出当前行符合条件的COFA值,不符合的则返回NULL
  • MAX()函数会忽略NULL,取每个MMITNO分组下对应条件的最大COFA值
  • GROUP BY MMITNO保证每个ID最终只返回一行

执行后就能得到你想要的单行结果:

MMITNO EAperCSE CSEperPAL CSEperLAY
10445 18 16 4
10446 27 40

第二步:添加计算列LAYperPAL

直接在上述查询基础上添加计算列即可,但要注意处理除数为NULL或0的情况(避免除以零错误),可以用NULLIF函数简化逻辑:

SELECT 
    MMITNO, 
    MAX(CASE WHEN ALUN='PCE' AND DMCF='2' THEN COFA END) AS EAperCSE, 
    MAX(CASE WHEN ALUN='PAL' AND DMCF='1' THEN COFA END) AS CSEperPAL, 
    MAX(CASE WHEN ALUN='LAY' AND DMCF='1' THEN COFA END) AS CSEperLAY,
    -- 处理除数为0或NULL的情况,此时返回NULL
    MAX(CASE WHEN ALUN='PAL' AND DMCF='1' THEN COFA END) / NULLIF(MAX(CASE WHEN ALUN='LAY' AND DMCF='1' THEN COFA END), 0) AS LAYperPAL
FROM MVXJDTA.MITMAS 
LEFT JOIN MVXJDTA.MITAUN ON MUITNO = MMITNO
GROUP BY MMITNO

逻辑说明:

  • NULLIF(a, 0)会在a等于0时返回NULL,这样除法运算遇到NULL就会返回NULL,和你期望的结果一致(比如ID10446的CSEperLAY为NULL,LAYperPAL也为NULL)
  • 如果不需要处理除数为0的情况,直接写除法即可,但建议保留这个逻辑避免报错

执行后就能得到最终结果:

MMITNO EAperCSE CSEperPAL CSEperLAY LAYperPAL
10445 18 16 4 4
10446 27 40 NULL

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:39:52