SQL行合并问题:GROUP BY导致多行输出,需聚合为单行
解决SQL多行合并为单行的问题
修改后的SQL代码
SELECT CH_USER4 AS 'Office', LEFT(CH_SORT, 3) AS 'Flt Lst Division', CH_USER5 AS 'Charter Type', CH_CODE AS 'Charter No', CH_DATE_REQ AS 'Flight Date', CAST(DATEPART(yyyy, CH_DATE_REQ) AS varchar(10)) + '-' + REPLACE(STR(DATEPART(mm, CH_DATE_REQ), 2), ' ', '0') AS 'Flight Month', MAX(C_COST - CH_ACTUAL_COST) AS 'Budget Outstanding', MAX(C_COST) AS 'Flt List Costs', SUM( CASE WHEN DET_NOM_YEAR = 'C' AND DET_PERIODNUMBR <= '7' THEN IIF(DET_TYPE = 'CRN', -(DET_NETT), DET_NETT) ELSE 0 END ) AS 'YTD Nominal', MAX( CASE WHEN CH_DATE_REQ >= '2023-02-01' AND CH_DATE_USER1 <= '2023-08-31' THEN C_COST ELSE 0 END ) AS 'C/Y Flt List Costs' FROM CST_COSTHEADER LEFT JOIN AT_BUDGETTOTAL ON CST_COSTHEADER.CH_CODE = AT_BUDGETTOTAL.CC_COPYHEADER LEFT JOIN SL_PL_NL_DETAIL on CST_COSTHEADER.CH_CODE = SL_PL_NL_DETAIL.DET_COSTHEADER WHERE CH_CODE = 'IR001565' AND DET_COSTCENTRE NOT LIKE 'ZINC' GROUP BY CH_USER4, CH_SORT, CH_USER5, CH_CODE, CH_DATE_REQ, CH_DATE_USER1
关键调整说明
- 简化GROUP BY子句:原GROUP BY包含了
C_COST、DET_NETT等会拆分结果的字段,这些字段值的差异导致输出多行。现在只保留目标单行中唯一的字段(如Office、Charter No等),确保分组后仅生成一行结果。 - YTD Nominal改为求和:将原CASE表达式嵌套在
SUM()函数中,累加所有符合条件的行的数值,得到总合9077.15。 - 调整C/Y Flt List Costs的聚合逻辑:将CASE内的
MAX(C_COST)改为直接取C_COST,外层用MAX()包裹,确保获取符合日期条件的最大成本值18077.15。 - 保留原有MAX聚合字段:
Budget Outstanding和Flt List Costs继续使用MAX(),确保取到你需要的最大值0和18077.15。
内容的提问来源于stack exchange,提问作者PeterK
相关产品推荐
相关产品推荐

