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

如何按Agent分组,统计不同FILE_ID的AMT总和及产品数量?

正确SQL写法解决关联父子表后的求和与统计问题

问题核心是父表的交易金额会因关联子表的多条产品记录被重复计算,所以必须拆分统计逻辑:先单独计算代理的销售总额(从父表直接分组),再统计对应的产品总数(关联父子表后统计),最后将两个结果合并。

解法1:子查询关联

SELECT
    tf.agent,
    tf.total_amt,
    COALESCE(tp.total_products, 0) AS total_products
FROM
    -- 先统计每个代理的销售总额(直接从父表分组,避免重复计算)
    (SELECT agent, SUM(amt) AS total_amt
     FROM transaction_file
     GROUP BY agent) tf
LEFT JOIN
    -- 统计每个代理对应的产品总数(关联父子表后计数)
    (SELECT tf.agent, COUNT(tp.id) AS total_products
     FROM transaction_product tp
     JOIN transaction_file tf ON tp.parent_file = tf.id
     GROUP BY tf.agent) tp
ON tf.agent = tp.agent;

解法2:CTE(公共表表达式)

这种写法逻辑更清晰,适合复杂场景:

WITH agent_total_amt AS (
    -- 单独计算代理的销售总额
    SELECT
        agent,
        SUM(amt) AS total_amt
    FROM transaction_file
    GROUP BY agent
),
agent_product_total AS (
    -- 统计代理的产品总数
    SELECT
        tf.agent,
        COUNT(tp.id) AS total_products
    FROM transaction_product tp
    INNER JOIN transaction_file tf ON tp.parent_file = tf.id
    GROUP BY tf.agent
)
-- 合并两个统计结果
SELECT
    ata.agent,
    ata.total_amt,
    COALESCE(apt.total_products, 0) AS total_products
FROM agent_total_amt ata
LEFT JOIN agent_product_total apt ON ata.agent = apt.agent;

为什么之前的方法错误?

  • 使用SUM(DISTINCT File.amt):若不同交易文件的金额相同,会被去重,导致统计的总额偏小。
  • 使用SUM(File.amt):关联子表后,父表的单条交易记录会被重复匹配多次(等于对应产品数),金额被重复累加,导致总额偏大。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 19:48:21