【发布时间】:2021-05-06 07:42:33
【问题描述】:
我正在开发一个包含销售信息的数据库;这个表格是相当基本的:
ContractID(PK)、CustomerID(FK)、SalesAgent(FK)、Value(int)、SalesDate(Date)
而且我需要制作月度销售报告 - 听起来很简单;按月份对日期进行分组。
但是,客户有一个非日历月销售结构 - 实际上,大多数月份是 28 天,12 月是 42 天,4 月和 8 月是 35 天 - 这意味着所有月份都从星期一开始,额外的复活节、盛夏和圣诞节会分配几个星期,因为此时业务通常较慢。
所以我有一个这样的日历:
Month. StartDate, EndDate
1. 20210104, 20210131
2. 20210201, 20210228
3. 20210301, 20210328
4. 20210329, 20210502
5. 20210503, 20210530
6. 20210531, 20210627
7. 20210628, 20210725
8. 20210726, 20210829
9. 20210830, 20210926
10. 20210927, 20211024
11. 20211025, 20211121
12. 20211122, 20220102
13. 20220103, 20220130
14. 20220131, 20220227
etc.
将每个销售分配到上述时间段以进行分组以进行报告的最佳方法是什么 - 我最初考虑将上表作为我的查询中的 CTE,然后根据开始和结束之前和之后的 SalesDate 进行选择上面的日期,但是我用什么连接将它链接到主查询?
除了对上面列出的每个特定时间段运行查询之外,没有其他方法可以解决这个问题,还是可以使用 UNION 来完成?
(希望这是有道理的)
【问题讨论】:
-
只需为合理的时间段(例如,直到 2030 年)创建静态自定义日历表(id、年、月、starts_at、ends_at)并将其用作基础。您也可以创建存储过程,为给定期间生成此日历临时表,或者检查/更新静态日历表是否损坏。