如何在SQL查询中合并指定两行数据并求和(将9条结果变为8条)
实现两行合并求和的SQL修改方案
要把CD为455000和456000的两行合并成一行并展示求和结果,核心是对这两个CD做统一映射,再基于映射后的字段分组。具体修改如下:
修改后的完整SQL
SELECT -- 将455000和456000映射为同一标识,也可替换为其中一个CD值 CASE WHEN BF_BDOB.CD IN ('455000', '456000') THEN '455000_合并' ELSE BF_BDOB.CD END AS CD, -- 对应名称统一处理,若两个CD名称相同可直接用BF_BDOB.NM CASE WHEN BF_BDOB.CD IN ('455000', '456000') THEN '合并项名称' ELSE BF_BDOB.NM END AS NM, MV_BF_ORGN_CNSL.BF_ORGN_PARN_CD, ROUND(SUM(CASE WHEN [BF_TM_PERD_RLUP_VW].BF_TM_PERD_PARN_CD = 'PY2ACT' THEN bf_data.data ELSE 0 END), 0) AS PY2ACT FROM BF_BDOB INNER JOIN BF_DATA INNER JOIN BF_BDOB_RLUP ON BF_DATA.BF_BDOB_ID = BF_BDOB_RLUP.BF_BDOB_CHLD_ID INNER JOIN MV_BF_ORGN_CNSL ON BF_DATA.BF_ORGN_ID = MV_BF_ORGN_CNSL.ID ON BF_BDOB.ID = BF_BDOB_RLUP.BF_BDOB_PARN_ID LEFT OUTER JOIN BF_TM_PERD_RLUP_VW ON BF_DATA.BF_TM_PERD_CD = BF_TM_PERD_RLUP_VW.CD WHERE BF_BDOB_RLUP.RLUP_NUM = 3 AND BF_BDOB.CD IN ('451000', '453000', '454000', '455000', '456000', '477000', '478000', '495000', '498000') GROUP BY -- GROUP BY需与SELECT中的映射逻辑完全一致 CASE WHEN BF_BDOB.CD IN ('455000', '456000') THEN '455000_合并' ELSE BF_BDOB.CD END, CASE WHEN BF_BDOB.CD IN ('455000', '456000') THEN '合并项名称' ELSE BF_BDOB.NM END, MV_BF_ORGN_CNSL.BF_ORGN_PARN_CD, MV_BF_ORGN_CNSL.BF_ORGN_CNSL_SLCN_CD, MV_BF_ORGN_CNSL.XTRN_LEVL, BF_BDOB.OBJ_TYP HAVING MV_BF_ORGN_CNSL.BF_ORGN_CNSL_SLCN_CD = '2324' AND MV_BF_ORGN_CNSL.XTRN_LEVL = '3' AND MV_BF_ORGN_CNSL.BF_ORGN_PARN_CD = '5100000' AND BF_BDOB.OBJ_TYP = 'R'
关键修改点
- CD字段映射:通过
CASE语句将455000和456000转为同一个值,让这两行进入同一分组。 - 名称字段统一:如果两个CD对应的名称不同,同样用
CASE统一显示名称;若名称相同,可直接保留BF_BDOB.NM。 - GROUP BY同步调整:必须保证
GROUP BY中的字段和SELECT里的非聚合字段逻辑完全一致,否则分组会出错。 - 筛选逻辑优化:把原
HAVING中的CD筛选移到WHERE子句,提升查询效率。
内容的提问来源于stack exchange,提问作者Nik Georgiev
相关产品推荐
相关产品推荐

