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

请求编写正确SQL:关联ORDERS与Transactions表实现聚合统计

问题:关联ORDERS和Transactions表实现员工订单统计查询

现有ORDERS和Transactions两张业务表,表结构及数据如下:

ORDERS表

id   order_id   e_id   e_name 
1    1000       1001   Tom
2    1009       1001   Tom
3    1010       1001   Tom
4    1011       1002   Parker
5    1012       1002   Parker
6    1013       1003   Rohan

Transactions表

id  order_id  amount  status 
1   1000      100     success
2   1009      80      success      
3   1010      100     failed 
4   1011      50      success
6   1012      50      success
7   1013      100     failed

需要关联两表,查询得到包含以下字段的统计结果:

  • e_id:员工ID
  • e_name:员工姓名
  • amount_sum:该员工所有订单的总金额
  • total_counts:该员工的总订单数
  • total_success_amount:该员工所有成功订单的总金额
  • success_count:该员工的成功订单数

预期输出如下:

e_id   e_name  amount_sum  total_counts total_success_amount  success_count
  1001   Tom     280         3            180                   2
  1002   Parker  100         2            100                   2
  1003   Rohan   100         1            0                     0      

本人尝试的SQL语句如下,但未得到正确结果:

use card;
SELECT COUNT(orders.order_id) as `total_counts`, 
COUNT(CASE WHEN transactions.status = 'success' THEN 1 END) as `success_count`, 
SUM(0 + transactions.amount) as `amount_sum`, orders.e_id, 
orders.e_name 
FROM orders 
LEFT JOIN transactions  
ON transactions.order_id=orders.order_id
GROUP BY (orders.e_id), (orders.order_id),  
(orders.e_name), (transactions.amount), (transactions.status);

正确SQL语句

USE card;
SELECT 
    o.e_id,
    o.e_name,
    SUM(t.amount) AS amount_sum,
    COUNT(o.order_id) AS total_counts,
    COALESCE(SUM(CASE WHEN t.status = 'success' THEN t.amount END), 0) AS total_success_amount,
    COALESCE(COUNT(CASE WHEN t.status = 'success' THEN 1 END), 0) AS success_count
FROM orders o
LEFT JOIN transactions t ON t.order_id = o.order_id
GROUP BY o.e_id, o.e_name;

错误原因说明

原SQL的核心问题是GROUP BY子句包含了多余的字段:order_id、transactions.amount、transactions.status会导致按每个订单、每个金额、每个状态单独分组,无法实现按员工维度的聚合统计。正确的分组应该仅按员工的唯一标识(e_id和e_name)进行。

另外,使用COALESCE函数可以确保当没有成功订单时,total_success_amount和success_count返回0而非NULL,符合预期输出要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 14:15:41