如何用SQL子查询统计各经理及其团队的总商品数与总收入?
没问题,这就帮你搞定这个SQL统计需求!先咱们对齐下前提哈——根据你说的items_revenue表,我先默认它有这些核心字段(要是实际字段名不一样,你直接替换就行):user_id(每个成员/经理的唯一标识)、user_name(人名)、is_manager(1代表是经理)、manager_id(下属对应的直属经理ID)、total_items(该成员的商品总数)、revenue(该成员的收入)。
接下来要实现的是:给每个经理算出他自己加所有下属的总商品数和总收入,还不能用CASE表达式,得用子查询。我给你两种可行的写法,按需选就行:
写法一:关联子查询(直观易懂)
这种写法直接针对每个经理,用子查询揪出他的整个团队(包括自己)然后求和,逻辑很清晰:
SELECT m.user_id AS manager_id, m.user_name AS manager_name, -- 子查询统计团队总商品数:包含经理自己+下属 (SELECT SUM(total_items) FROM items_revenue t WHERE t.manager_id = m.user_id OR t.user_id = m.user_id) AS team_total_items, -- 子查询统计团队总收入 (SELECT SUM(revenue) FROM items_revenue t WHERE t.manager_id = m.user_id OR t.user_id = m.user_id) AS team_total_revenue FROM items_revenue m WHERE m.is_manager = 1 GROUP BY m.user_id, m.user_name;
逻辑拆解:
- 外层先捞出来所有经理(
m.is_manager = 1),这是我们要统计的主体; - 每个子查询都对应当前经理
m,筛选出两类人:要么是经理自己(t.user_id = m.user_id),要么是他的直接下属(t.manager_id = m.user_id),然后对这两类人的商品数和收入分别求和; - 最后按经理的ID和名称分组,保证每个经理只出一行结果。
写法二:子查询生成团队列表后聚合(性能更优)
如果你的数据量比较大,这种写法可能更高效——先通过JOIN把经理和他的团队成员拼到一起,再外层聚合求和,全程没用到CASE:
SELECT manager_id, manager_name, SUM(total_items) AS team_total_items, SUM(revenue) AS team_total_revenue FROM ( -- 内层子查询:把每个经理和他的团队成员(含自己)关联起来 SELECT m.user_id AS manager_id, m.user_name AS manager_name, t.total_items, t.revenue FROM items_revenue m JOIN items_revenue t ON t.manager_id = m.user_id OR t.user_id = m.user_id WHERE m.is_manager = 1 ) AS team_data GROUP BY manager_id, manager_name;
逻辑拆解:
- 内层子查询通过JOIN,把每个经理
m和所有属于他的团队成员(自己+下属)做关联,生成一张包含经理信息+团队成员业绩的中间表; - 外层直接对这张中间表按经理分组,求和所有成员的商品数和收入,得到团队总和。
要是你的表字段和我假设的不一样(比如用parent_id代替manager_id,或者没有user_name),直接替换对应的字段名就可以用啦!
内容的提问来源于stack exchange,提问作者Zhanrah
相关产品推荐
相关产品推荐

