如何在MySQL的CASE语句中对两个值求和?附查询代码
在CASE语句中实现多条件数值求和的解决方案
嘿,我懂你想实现的需求——把符合两个不同条件的数值在CASE逻辑里加总起来,其实这个操作很容易实现,核心思路就是把CASE判断嵌套在SUM聚合函数里就行,我给你一步步拆解:
核心逻辑说明
你原来的CASE是用来标记维度名称(比如gross_written_premiums),现在要计算对应维度的总和,只需要把判断条件放到SUM里,让每个符合条件的行贡献对应的数值,SUM会自动把这些值累加起来。
完整SQL示例
假设QRT_VALUES表中存储数值的字段叫amount(你可以替换成实际的字段名,比如value之类的),完整的查询语句应该是这样的:
SELECT ORG.`id`, ORG.`organisation_name`, SFCR.report_date_year, -- 保留你原来的维度命名逻辑 CASE WHEN (QRT_VALUES.`template_id` = 'S.05.01.02.01' AND QRT_VALUES.`row_id` = 'R0110' AND QRT_VALUES.`column_id` = 'C0200') THEN 'gross_written_premiums' WHEN (QRT_VALUES.`template_id` = 'S.05.01.02.02' AND QRT_VALUES.`row_id` = 'R1410' AND QRT_VALUES.`column_id` = 'C0300') THEN 'gross_written_premiums' END AS Dimension, -- 这里实现两个条件下的数值求和 SUM( CASE WHEN (QRT_VALUES.`template_id` = 'S.05.01.02.01' AND QRT_VALUES.`row_id` = 'R0110' AND QRT_VALUES.`column_id` = 'C0200') THEN QRT_VALUES.`amount` WHEN (QRT_VALUES.`template_id` = 'S.05.01.02.02' AND QRT_VALUES.`row_id` = 'R1410' AND QRT_VALUES.`column_id` = 'C0300') THEN QRT_VALUES.`amount` ELSE 0 -- 用0代替NULL,SUM会自动忽略不影响结果,也可以直接写NULL END ) AS gross_written_premiums_total FROM ORG -- 记得补充你实际的表关联条件 JOIN SFCR ON ORG.xxx = SFCR.xxx JOIN QRT_VALUES ON SFCR.xxx = QRT_VALUES.xxx -- 可选:过滤掉不符合条件的行,提升查询效率 WHERE (QRT_VALUES.`template_id` = 'S.05.01.02.01' AND QRT_VALUES.`row_id` = 'R0110' AND QRT_VALUES.`column_id` = 'C0200') OR (QRT_VALUES.`template_id` = 'S.05.01.02.02' AND QRT_VALUES.`row_id` = 'R1410' AND QRT_VALUES.`column_id` = 'C0300') GROUP BY ORG.`id`, ORG.`organisation_name`, SFCR.report_date_year, Dimension; -- 非聚合字段必须加入GROUP BY,否则会报错
关键注意点
- 替换数值字段:一定要把示例里的
QRT_VALUES.amount``改成你表中实际存储数值的字段名。 - GROUP BY的必要性:因为用了SUM聚合函数,SELECT里所有非聚合的字段(比如ORG.id、Dimension等)都必须放到GROUP BY里,这是SQL的标准要求。
- 过滤条件优化:加上WHERE子句可以提前过滤掉不需要的行,让查询更快,如果你不需要保留其他维度的行,强烈建议加上。
内容的提问来源于stack exchange,提问作者bharath
相关产品推荐
相关产品推荐

