单SELECT查询中双SUM子查询出错,求解决及日期排序
问题解决:按客户统计早晚订单量并按日期排序
你的问题出在子查询未关联当前客户,导致evening字段计算的是所有客户的晚间订单总量,而非单个客户的;同时原查询仅筛选了早间订单的日期,晚间订单未限定对应日期。
推荐使用条件聚合替代子查询,既能简化语句,又能准确统计单个客户的早晚订单量,同时支持按日期排序:
SELECT c.customername, SUM(CASE WHEN o.timing = 'Morning' THEN o.quantity ELSE 0 END) AS `Morning (qty)`, SUM(CASE WHEN o.timing = 'Evening' THEN o.quantity ELSE 0 END) AS `Evening (qty)`, o.orderDate FROM Orders o INNER JOIN Order_Customer t ON o.orderId = t.orderId INNER JOIN Customer c ON t.customerId = c.customerid WHERE o.orderDate = '2023-02-23' -- 建议使用标准日期格式,避免数据库解析异常 GROUP BY c.customername, o.orderDate ORDER BY o.orderDate DESC; -- 按日期降序排序,如需升序改为ASC
关键调整说明:
- 用
CASE WHEN在聚合函数内区分早晚订单,一次扫描即可完成单个客户两个时段的数量统计,无需嵌套子查询。 - 分组时包含
orderDate字段,确保可以按日期排序;若需统计所有日期的客户订单,直接移除WHERE子句即可。 - 统一使用
YYYY-MM-DD标准日期格式,避免不同数据库对非标准格式的解析差异。
如果你的数据库支持PIVOT语法(如SQL Server),也可通过该方式实现,但条件聚合的兼容性更强,适用于MySQL、PostgreSQL、Oracle等绝大多数关系型数据库。
内容的提问来源于stack exchange,提问作者MuhammadHassan Siddiqui
相关产品推荐
相关产品推荐

