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

如何在MySQL中通过Union与左连接实现存提款数据统计查询

MySQL 查询实现方案

核心思路

先分别统计指定日期范围内、状态为Approved的用户存款/取款总额,再通过关联所有有有效交易记录的用户,用空值处理函数覆盖单边无记录的场景,最后计算净额并排序。

假设表结构

  • 存款表(deposits):userid, name, email, amount, status, create_date
  • 取款表(withdrawals):userid, name, email, amount, status, create_date

查询语句

WITH all_valid_users AS (
    -- 提取所有有有效交易记录的用户(去重)
    SELECT userid, name, email
    FROM deposits
    WHERE status = 'Approved' 
      AND create_date BETWEEN '2024-01-01' AND '2024-06-30'
    UNION
    SELECT userid, name, email
    FROM withdrawals
    WHERE status = 'Approved' 
      AND create_date BETWEEN '2024-01-01' AND '2024-06-30'
),
deposit_summary AS (
    -- 统计用户总存款
    SELECT userid, SUM(amount) AS total_deposit
    FROM deposits
    WHERE status = 'Approved' 
      AND create_date BETWEEN '2024-01-01' AND '2024-06-30'
    GROUP BY userid
),
withdrawal_summary AS (
    -- 统计用户总取款
    SELECT userid, SUM(amount) AS total_withdrawal
    FROM withdrawals
    WHERE status = 'Approved' 
      AND create_date BETWEEN '2024-01-01' AND '2024-06-30'
    GROUP BY userid
)
SELECT 
    au.userid,
    au.name,
    au.email,
    COALESCE(ds.total_deposit, 0) AS 总存款,
    COALESCE(ws.total_withdrawal, 0) AS 总取款,
    COALESCE(ds.total_deposit, 0) - COALESCE(ws.total_withdrawal, 0) AS 净额
FROM all_valid_users au
LEFT JOIN deposit_summary ds ON au.userid = ds.userid
LEFT JOIN withdrawal_summary ws ON au.userid = ws.userid
ORDER BY 净额 DESC;

关键细节说明

  1. UNION获取全量用户:避免遗漏仅存存款或仅存取款记录的用户,同时自动去重
  2. COALESCE处理空值:当用户无对应交易记录时,将总额设为0,保证净额计算正确
  3. 日期参数替换:把示例中的'2024-01-01'和'2024-06-30'替换为实际业务需要的日期区间
  4. CTE拆分逻辑:将用户提取、交易统计拆分为独立模块,SQL结构更清晰,后期维护更方便

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 04:01:21