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

如何连接用户、存款、取款三张表完成求和并按多字段分组查询

三表关联按多维度分组统计交易数据方案

原始表说明

用户表(User Table)

用户表结构

存款表(Deposit Table)

存款表结构

取款表(Withdrawal Table)

取款表结构

查询需求

需要关联上述三张表,按以下四个维度分组统计:

  • Month(月份)
  • Sex(性别)
  • Age(年龄)
  • State(州)
    统计指标包含:
  • 分组总存款金额:sum(Deposit.amount)
  • 分组总取款金额:sum(Withdrawal.amount)
  • 分组内用户数量
    分组示例:

分组1:月份=一月、性别=女、年龄=18、所在州=亚利桑那州
分组2:月份=一月、性别=男、年龄=21、所在州=得克萨斯州


补充说明

预期输出的月份字段由存款表和取款表的交易月份合并得出,用户表中新增的「账户创建月份」字段可作为三张表按月份关联的可选字段。
预期输出效果参考:
预期输出结构

实现方案

核心思路

为了避免多表直接关联产生笛卡尔积导致金额计算重复,先分别聚合存、取款表的单用户单月交易数据,再合并交易数据关联用户属性,最后按目标维度分组汇总即可。

示例SQL代码(标准SQL语法)

WITH monthly_deposit AS (
    -- 预聚合单用户单月存款总额
    SELECT
        user_id,
        DATE_TRUNC('month', transaction_date) AS tran_month,
        SUM(amount) AS total_deposit
    FROM deposit
    GROUP BY user_id, DATE_TRUNC('month', transaction_date)
),
monthly_withdrawal AS (
    -- 预聚合单用户单月取款总额
    SELECT
        user_id,
        DATE_TRUNC('month', transaction_date) AS tran_month,
        SUM(amount) AS total_withdrawal
    FROM withdrawal
    GROUP BY user_id, DATE_TRUNC('month', transaction_date)
),
user_monthly_tran AS (
    -- 合并存、取款的月度用户交易数据
    SELECT
        COALESCE(d.user_id, w.user_id) AS user_id,
        COALESCE(d.tran_month, w.tran_month) AS stat_month,
        COALESCE(d.total_deposit, 0) AS total_deposit,
        COALESCE(w.total_withdrawal, 0) AS total_withdrawal
    FROM monthly_deposit d
    FULL OUTER JOIN monthly_withdrawal w
        ON d.user_id = w.user_id AND d.tran_month = w.tran_month
)
-- 关联用户属性后按目标维度分组统计
SELECT
    TO_CHAR(umt.stat_month, 'FMMonth') AS "Month",
    u.sex AS "Sex",
    u.age AS "Age",
    u.state AS "State",
    SUM(umt.total_deposit) AS total_deposit_amount,
    SUM(umt.total_withdrawal) AS total_withdrawal_amount,
    COUNT(DISTINCT umt.user_id) AS group_user_count
FROM user_monthly_tran umt
LEFT JOIN "user" u ON umt.user_id = u.user_id
GROUP BY "Month", "Sex", "Age", "State"
ORDER BY "Month", "State", "Sex", "Age";

可选调整

如果需要统计仅创建账户、当月没有任何交易的用户分组,只需将最后一步的关联逻辑改为从用户表左连user_monthly_tran,关联条件额外添加u.account_created_month = umt.stat_month即可。


内容的提问来源于stack exchange,提问作者BreadBoard.ini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 20:51:00