SQL查询问题:仅通过5/18用例,需修正用户2019年买家订单统计
SQL查询修正:获取用户2019年订单数
原查询的问题
原SQL仅能通过18个测试用例中的5个,核心问题是结果缺失了2019年无订单的用户:
- 原查询以
Orders表为基础构建CTE,仅包含有过订单的买家ID - 左连
Users表后,无法覆盖从未下单或2019年无订单的用户,导致这类用户的记录完全缺失,不符合需求中“每个用户”的要求
正确的SQL查询
SELECT u.user_id AS buyer_id, u.join_date, SUM(CASE WHEN YEAR(o.order_date) = 2019 THEN 1 ELSE 0 END) AS orders_in_2019 FROM Users u LEFT JOIN Orders o ON u.user_id = o.buyer_id GROUP BY u.user_id, u.join_date
也可以用COUNT实现等价逻辑:
SELECT u.user_id AS buyer_id, u.join_date, COUNT(CASE WHEN YEAR(o.order_date) = 2019 THEN 1 END) AS orders_in_2019 FROM Users u LEFT JOIN Orders o ON u.user_id = o.buyer_id GROUP BY u.user_id, u.join_date
修正逻辑说明
- 以Users表为主表:确保所有用户都被纳入结果,哪怕没有任何订单
- 左连Orders表:关联用户的订单记录,无订单的用户对应字段为
NULL - 条件统计:
SUM(CASE...):符合2019年的订单记1,否则记0,求和得到订单数;无订单时总和为0COUNT(CASE...):仅统计符合条件的非NULL值,无符合条件订单时返回0(CASE不满足时返回NULL,COUNT不统计NULL)
测试数据与预期输出
Users表结构及数据
+---------+------------+----------------+ | user_id | join_date | favorite_brand | +---------+------------+----------------+ | 1 | 2018-01-01 | Lenovo | | 2 | 2018-02-09 | Samsung | | 3 | 2018-01-19 | LG | | 4 | 2018-05-21 | HP | +---------+------------+----------------+
Orders表结构及数据
+----------+------------+---------+----------+-----------+ | order_id | order_date | item_id | buyer_id | seller_id | +----------+------------+---------+----------+-----------+ | 1 | 2019-08-01 | 4 | 1 | 2 | | 2 | 2018-08-02 | 2 | 1 | 3 | | 3 | 2019-08-03 | 3 | 2 | 3 | | 4 | 2018-08-04 | 1 | 4 | 2 | | 5 | 2018-08-04 | 1 | 3 | 4 | | 6 | 2019-08-05 | 2 | 2 | 4 | +----------+------------+---------+----------+-----------+
预期正确输出
+-----------+------------+----------------+ | buyer_id | join_date | orders_in_2019 | +-----------+------------+----------------+ | 1 | 2018-01-01 | 1 | | 2 | 2018-02-09 | 2 | | 3 | 2018-01-19 | 0 | | 4 | 2018-05-21 | 0 | +-----------+------------+----------------+
内容的提问来源于stack exchange,提问作者Tushar
相关产品推荐
相关产品推荐

