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值,不符合的则返回NULLMAX()函数会忽略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
相关产品推荐
相关产品推荐

