You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

跨4张关联表计算amount总和并生成指定格式报表的技术求助

没问题,我帮你搞定这个跨表汇总的报表需求!核心思路是利用条件聚合来实现你要的行列映射,再结合表关联把所有数据串起来,最后加上总计行就完美匹配你的格式了。

第一步:理清楚表关联关系

先明确各表的关联链路,确保数据能正确串联:

  • 第一张主表(记为master1)的ID_1关联第二张主表(记为master2)的ID_1
  • master2ID_2关联交易表TransactionID_2
  • 所有数据需匹配report templatecpy_ID=1400的报表组

第二步:编写SQL实现报表逻辑

这里用条件聚合(SUM(CASE ...))来实现按报表组分配对应ID_1的汇总值,再通过UNION ALL添加纵向总计行,兼容大多数数据库:

-- 主查询:生成报表组的行数据
SELECT
    rt.report_set_id AS " ",
    -- 对应第一张主表ID_1=1的列,仅set001显示数据,其他显示'-'
    CASE 
        WHEN rt.report_set_id = 'set001' THEN COALESCE(SUM(t.amount), 0)::VARCHAR
        ELSE '-'
    END AS "1",
    -- 对应第一张主表ID_1=2的列,仅set002显示数据,其他显示'-'
    CASE 
        WHEN rt.report_set_id = 'set002' THEN COALESCE(SUM(t.amount), 0)::VARCHAR
        ELSE '-'
    END AS "2",
    -- 横向求和:仅当前行有数据时计算,否则显示对应值
    CASE
        WHEN rt.report_set_id = 'set001' THEN COALESCE(SUM(t.amount), 0)::VARCHAR
        WHEN rt.report_set_id = 'set002' THEN COALESCE(SUM(t.amount), 0)::VARCHAR
        ELSE '-'
    END AS "TOTAL"
FROM report_template rt
-- 关联第一张主表,获取ID_1维度
LEFT JOIN (SELECT DISTINCT ID_1 FROM Master) master1 ON 1=1
-- 关联第二张主表,建立ID_1到ID_2的映射
LEFT JOIN Master master2 ON master1.ID_1 = master2.ID_1
-- 关联交易表,筛选对应cpy_ID的交易数据
LEFT JOIN Transaction t ON master2.ID_2 = t.ID_2 AND t.cpy_ID = rt.cpy_ID
WHERE rt.cpy_ID = 1400
-- 按报表组分组计算
GROUP BY rt.report_set_id

UNION ALL

-- 添加纵向总计行
SELECT
    'TOTAL' AS " ",
    -- 列1总和:所有ID_1=1的交易金额总和
    (SELECT COALESCE(SUM(t.amount), 0) FROM Transaction t JOIN Master m2 ON t.ID_2=m2.ID_2 WHERE m2.ID_1=1 AND t.cpy_ID=1400)::VARCHAR AS "1",
    -- 列2总和:所有ID_1=2的交易金额总和
    (SELECT COALESCE(SUM(t.amount), 0) FROM Transaction t JOIN Master m2 ON t.ID_2=m2.ID_2 WHERE m2.ID_1=2 AND t.cpy_ID=1400)::VARCHAR AS "2",
    -- 总合计:所有交易金额总和
    COALESCE(SUM(t.amount), 0)::VARCHAR AS "TOTAL"
FROM Transaction t
WHERE t.cpy_ID = 1400

第三步:结果说明

执行这段SQL后,你会得到完全符合要求的报表格式:

  • set001行:列1显示ID_1=1(即Name_1=A)的所有交易总和(123+234=357),列2显示-,横向总计显示357
  • set002行:列1显示-,列2显示ID_1=2(即Name_1=B)的所有交易总和(321+231=552),横向总计显示552
  • TOTAL行:列1显示357,列2显示552,总合计显示357+552=909

补充小提示

  • COALESCE是为了处理没有交易数据的情况,避免出现NULL
  • 如果用MySQL,把::VARCHAR换成CAST(COALESCE(...) AS CHAR)即可
  • 若你的数据库支持PIVOT语法,也可以用它实现行列转换,但条件聚合的兼容性更强,适合多数据库场景

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

火山引擎 最新活动