技术问询:如何展示所有日期?当前仅显示有销售的日期
问题修复方案
原SQL的核心问题
- 语法与逻辑错误:SELECT子句中错误用AND拼接条件,WHERE子句位置混乱,且重复的
product_type_id = 55和product_type_id = 6条件逻辑矛盾(同一记录的产品类型不可能同时等于两个不同值)。 - 缺少全量日期数据源:仅查询
products表,只能返回有销售记录的日期,无法覆盖所有目标日期。
修复步骤与代码示例
要显示所有日期,必须引入包含全量目标日期的数据源(日历表),再通过左连接关联销售数据。以下是两种常见实现方式:
方式1:临时生成日期范围(适合无现成日历表的场景)
以MySQL为例,生成最近90天的所有日期并统计:
WITH calendar AS ( SELECT DATE_SUB(CURDATE(), INTERVAL seq DAY) AS date FROM (SELECT 0 AS seq UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) s1 CROSS JOIN (SELECT 0 AS seq UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) s2 CROSS JOIN (SELECT 0 AS seq UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) s3 WHERE DATE_SUB(CURDATE(), INTERVAL seq DAY) >= DATE_SUB(CURDATE(), INTERVAL 90 DAY) ) SELECT c.date AS Date, COUNT(p.product_type_id) AS "POYOYO" FROM calendar c LEFT JOIN products p ON DATE(p.date_of_sale) = c.date AND p.product_type_id = 6 -- 仅保留需要统计的产品类型条件 GROUP BY c.date ORDER BY c.date DESC;
方式2:使用现成日历表(推荐长期使用)
如果数据库中已有包含全量日期的表(比如date_dim,含date字段),可以简化为:
SELECT d.date AS Date, COUNT(p.product_type_id) AS "POYOYO" FROM date_dim d LEFT JOIN products p ON DATE(p.date_of_sale) = d.date AND p.product_type_id = 6 WHERE d.date BETWEEN '2024-01-01' AND '2024-12-31' -- 替换为你的目标日期范围 GROUP BY d.date ORDER BY d.date DESC;
关键说明
- 左连接
LEFT JOIN确保日历表中的所有日期都会被返回,无销售记录的日期对应统计数为0。 - 把产品类型条件放在
ON子句而非WHERE子句,避免过滤掉无销售的日期。
内容的提问来源于stack exchange,提问作者newB
相关产品推荐
相关产品推荐

