SQL查询求助:统计每位乘客所在车厢的其他乘客数量
查询每位乘客所在车厢的其他乘客数量
首先修正你的数据插入语句(SQL字符串需用单引号包裹):
INSERT INTO passengers(id, name, cart_id) VALUES (1, 'Uolevi', 1), (2,'Maija', 1), (3, 'Kaaleppi', 2), (4, 'Kotivalo', 4), (5, 'Juustina', 4), (6, 'Vihtori', 4);
直接用COUNT(*)结合GROUP BY cart_id会将同一车厢的乘客聚合为单条记录,因此无法返回所有乘客的对应结果。要实现需求,需先统计每个车厢的总乘客数,再关联回原表计算其他乘客数(总人数减1,排除乘客自身)。
方法1:子查询关联
先通过子查询统计各车厢总人数,再与原表关联计算:
SELECT p.name AS `Column A`, (c.total_count - 1) AS `Column B` FROM passengers p JOIN ( SELECT cart_id, COUNT(*) AS total_count FROM passengers GROUP BY cart_id ) c ON p.cart_id = c.cart_id ORDER BY p.id;
方法2:窗口函数(适用于MySQL 8.0+、PostgreSQL等支持窗口函数的数据库)
使用窗口函数直接计算当前乘客所在车厢的总人数,再减1得到其他乘客数:
SELECT name AS `Column A`, (COUNT(*) OVER (PARTITION BY cart_id) - 1) AS `Column B` FROM passengers ORDER BY id;
两种方法均可得到期望结果:
| Column A | Column B |
|---|---|
| Uolevi | 1 |
| Maija | 1 |
| Kaaleppi | 0 |
| Kotivalo | 2 |
| Juustina | 2 |
| Vihtori | 2 |
内容的提问来源于stack exchange,提问作者FC Chelsea
相关产品推荐
相关产品推荐

