SQL:生成日期序列(填补缺失的日期)
你是一家零售公司的数据分析师,公司有一个 daily_sales
表记录了每日的销售数据。由于某些日期可能没有销售记录,你需要生成完整的日期序列并分析销售情况。
CREATE TABLE daily_sales (date DATE PRIMARY KEY,sales_amount DECIMAL(10,2) NOT NULL
);
题目要求
- 编写一个SQL查询,生成2023年全年的完整日期序列(从2023-01-01到2023-12-31)
- 将
daily_sales
表与生成的日期序列左连接,确保结果包含所有日期 - 对于没有销售记录的日期,销售金额显示为0
- 计算并显示每个日期是星期几(1-7,1=周日,7=周六)
- 标记每个日期是工作日(Weekday)还是周末(Weekend)
- 按日期排序结果
WITH RECURSIVE date_range AS (SELECT '2023-01-01' AS dateUNION ALLSELECT date + INTERVAL 1 DAYFROM date_rangeWHERE 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;
- 使用
WITH RECURSIVE
创建递归CTE - MySQL 的
DAYOFWEEK()
函数返回1(周日)到7(周六) - 日期加法使用
+ INTERVAL 1 DAY
语法