You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术问询:如何展示所有日期?当前仅显示有销售的日期

问题修复方案

原SQL的核心问题

  1. 语法与逻辑错误:SELECT子句中错误用AND拼接条件,WHERE子句位置混乱,且重复的product_type_id = 55和product_type_id = 6条件逻辑矛盾(同一记录的产品类型不可能同时等于两个不同值)。
  2. 缺少全量日期数据源:仅查询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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 22:25:24