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

SQL分组求和与行列转换及多场景扩展问题求助

多维度汇总表实现方案

为啥会出现两行数据?

你把货币判断的CASE语句加到GROUP BY里后,同一date+id下如果同时存在房租支出和其他类型记录,会被拆成两个分组——一个是符合房租条件的实际货币值,一个是不符合条件的'nothing',自然输出两行,和你预期的一行结果不符。

正确写法

用条件聚合就能同时搞定列组合求和、货币列提取,而且不用把货币判断放到GROUP BY里:

示例SQL

假设源表名为transactions,字段包含date, id, exprev, type, amount, Currency, usd_amount(usd_amount为转换后的美元金额):

SELECT
    date,
    id,
    -- 房租支出(本地货币)
    SUM(CASE WHEN exprev = 'Expense' AND type = 'rent' THEN amount ELSE 0 END) AS [rent expense (local)],
    -- 房租对应的货币类型
    MAX(CASE WHEN exprev = 'Expense' AND type = 'rent' THEN Currency END) AS [rent expense currency],
    -- 房租支出(USD)
    SUM(CASE WHEN exprev = 'Expense' AND type = 'rent' THEN usd_amount ELSE 0 END) AS [rent expense (USD)],
    -- 可扩展其他组合列,比如水电支出
    SUM(CASE WHEN exprev = 'Expense' AND type = 'utility' THEN amount ELSE 0 END) AS [utility expense (local)],
    MAX(CASE WHEN exprev = 'Expense' AND type = 'utility' THEN Currency END) AS [utility expense currency],
    SUM(CASE WHEN exprev = 'Expense' AND type = 'utility' THEN usd_amount ELSE 0 END) AS [utility expense (USD)]
FROM transactions
GROUP BY date, id
ORDER BY date, id;

关键点

  • 用SUM()做条件聚合,把exprev和type的组合作为判断条件,直接生成对应汇总列
  • 用MAX()提取货币值:同一date+id下的同类型支出货币通常一致,MAX()会自动忽略非目标行的NULL值,拿到唯一有效的货币类型
  • GROUP BY仅保留行维度的date和id,避免多余分组导致的多行问题

为啥PIVOT搞不定?

PIVOT只能基于单一列的不同值转列,无法直接处理exprev+type这种多列组合的场景,条件聚合在这类灵活的组合需求上比PIVOT更实用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 19:45:31