你是一家零售公司的数据分析师,公司有一个 daily_sales
表记录了每日的销售数据。由于某些日期可能没有销售记录,你需要生成完整的日期序列并分析销售情况。
sql
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)
- 按日期排序结果
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;
- 使用
WITH RECURSIVE
创建递归CTE - MySQL 的 DAYOFWEEK() 函数返回1(周日)到7(周六)
- 日期加法使用
+ INTERVAL 1 DAY
语法