SQL:生成日期序列(填补缺失的日期)

你是一家零售公司的数据分析师,公司有一个 daily_sales表记录了每日的销售数据。由于某些日期可能没有销售记录,你需要生成完整的日期序列并分析销售情况。

sql 复制代码
CREATE TABLE daily_sales (
    date DATE PRIMARY KEY,
    sales_amount DECIMAL(10,2) NOT NULL
);

题目要求

  1. 编写一个SQL查询,生成2023年全年的完整日期序列(从2023-01-01到2023-12-31)
  2. daily_sales表与生成的日期序列左连接,确保结果包含所有日期
  3. 对于没有销售记录的日期,销售金额显示为0
  4. 计算并显示每个日期是星期几(1-7,1=周日,7=周六)
  5. 标记每个日期是工作日(Weekday)还是周末(Weekend)
  6. 按日期排序结果
sql 复制代码
WITH RECURSIVE date_range AS (
    SELECT '2023-01-01' AS date
    UNION ALL
    SELECT date + INTERVAL 1 DAY
    FROM date_range
    WHERE date < '2023-12-31'
)
SELECT 
    d.date,
    COALESCE(s.sales_amount, 0) AS sales_amount,
    DAYOFWEEK(d.date) AS day_of_week,
    CASE WHEN DAYOFWEEK(d.date) IN (1, 7) THEN 'Weekend' ELSE 'Weekday' END AS day_type
FROM date_range d
LEFT JOIN daily_sales s ON d.date = s.date
ORDER BY d.date;
  1. 使用 WITH RECURSIVE 创建递归CTE
  2. MySQL 的 DAYOFWEEK() 函数返回1(周日)到7(周六)
  3. 日期加法使用 + INTERVAL 1 DAY 语法