【发布时间】:2022-01-10 17:57:03
【问题描述】:
我的任务是返回给定年份和月份内“每周”的订单数量(这一切都发生在 SSMS 中)。
我的数据如下所示:
| OrderId | DateCreated |
|---|---|
| 1 | 2021-12-04 06:01:14.6333333 |
| 2 | 2021-12-04 07:01:14.6333333 |
| 3 | 2021-12-24 00:00:00.0000000 |
| 4 | 2021-12-31 06:01:14.6333333 |
| 5 | 2021-12-31 06:01:14.6333333 |
我想让结果表看起来像这样:
| Week | OrdersCount |
|---|---|
| 1 | 1 |
| 2 | 0 |
| 3 | 0 |
| 4 | 1 |
| 5 | 2 |
目前我有以下 SQL 存储过程,它以年份 (@year) 和月份 (@month) 作为参数:
SELECT
SUM(CASE WHEN DateCreated BETWEEN (DATEFROMPARTS(@year, @month, 01)) AND (DATEFROMPARTS(@year, @month, 07))
THEN 1 ELSE 0 END) AS Week1,
SUM(CASE WHEN DateCreated BETWEEN (DATEFROMPARTS(@year, @month, 08)) AND (DATEFROMPARTS(@year, @month, 14))
THEN 1 ELSE 0 END) AS Week2,
SUM(CASE WHEN DateCreated BETWEEN (DATEFROMPARTS(@year, @month, 15)) AND (DATEFROMPARTS(@year, @month, 21))
THEN 1 ELSE 0 END) AS Week3,
SUM(CASE WHEN DateCreated BETWEEN (DATEFROMPARTS(@year, @month, 22)) AND (DATEFROMPARTS(@year, @month, 28))
THEN 1 ELSE 0 END) AS Week4,
SUM(CASE WHEN DateCreated BETWEEN (DATEFROMPARTS(@year, @month, 29)) AND (DATEFROMPARTS(@year, @month, 29))
THEN 1 ELSE 0 END) AS Week5
FROM
dbo.Orders
上述语句返回的内容与我需要的内容接近,但存在一些问题,我的结果集如下所示:
| wk1 | wk2 | wk3 | wk4 | wk5 | |
|---|---|---|---|---|---|
| 1 | 1 | 0 | 0 | 1 | 0 |
所以最大的问题当然是第 5 周的方向和缺失的订单。我的周是沿 x 轴而不是 y 轴显示的,但似乎因为 EOMONTH() 函数默认时间戳到午夜为止,当月最后一天上午 12 点以后下的任何订单都不会被考虑在内。
根据我迄今为止所做的研究,我相信我应该使用DATEADD、DATEDIFF 和COUNT 的某种组合(而不是SUM,这样我就可以使用@987654333 @) 我对这些函数/语句如何独立工作有很好的理解,但是很难将它们组合在一起以达到我的目标。任何和所有的帮助将不胜感激!
【问题讨论】:
-
您使用的是哪个 rdms? MySQL SQL 服务器?
-
我正在使用 SSMS。不确定这是否回答了你的问题。 Microsoft SQL Server 管理系统
-
@nbk 请在上面发表评论。 ^
-
使用日期的星期怎么样?
datepart(week, DateCreated)? (取决于 DATEFIRST 设置) 还是加入 calendar table? -
Week5 有错字:应该是
AND DATEFROMPARTS(@year, @month, 31)
标签: sql-server datetime count datediff dateadd