将每日数据分组为每周数据,但在年度更改时将错误分组

时间:2018-01-31 22:59:53

标签: sql tsql sql-server-2012 group-by sum

我有一个基本的表格,每天都有每日日期和数值。但是,在必要的过滤器之后,缺少某些日期。我希望这个每日数据(虽然缺少一周中的随机天数)每周分组,本周开始是星期日,本周结束时间是星期六。例如,以其中一周的数据为例:

|---------------------|------------------|
|      DATE           |     Number       |
|---------------------|------------------|
|    01/23/18         |         2        |
|---------------------|------------------|
|    01/25/18         |         5        |
|---------------------|------------------|
|    01/27/18         |         3        |
|---------------------|------------------|
|    01/29/18         |         1        |
|---------------------|------------------|
|    01/31/18         |         4        |
|---------------------|------------------|
|    02/02/18         |         8        |
|---------------------|------------------|

这就是我希望在小组之后显示的数据:

|---------------------|------------------|
|   Week_Start        |        SUM       |
|---------------------|------------------|
|    01/21/18         |         10       |
|---------------------|------------------|
|    01/28/18         |         13       |
|---------------------|------------------|

这是我到目前为止所做的:

SET DATEFIRST 7
SELECT DATEADD(WEEK, DATEPART(WEEK,a.DATE_NOTIME)-1, DATEADD(YEAR, DATEDIFF(YEAR, 0, a.DATE_NOTIME), 0))   AS 'Week_Start'
      ,SUM(a.Daily_Count) AS 'Total_Weekly_Sum'
FROM
(SELECT DATEADD(dd, DATEDIFF(dd, 0, t.DATE), 0) AS 'DATE_NOTIME'
       ,COUNT(t.TicketID) AS 'Daily_Count'
  FROM daily_Table t
  GROUP BY DATEADD(dd, DATEDIFF(dd, 0, t.DATE), 0)
) AS a
GROUP BY DATEADD(WEEK, DATEPART(WEEK,a.DATE_NOTIME)-1, DATEADD(YEAR,DATEDIFF(YEAR, 0, a.DATE_NOTIME), 0))

ORDER BY DATEADD(WEEK, DATEPART(WEEK,a.DATE_NOTIME)-1, DATEADD(YEAR, DATEDIFF(YEAR, 0, a.DATE_NOTIME), 0))

SET DATEFIRST 6

我对上述代码的问题在于,2017年全年与“WeeK_Start”的正确总和和日期完全分组。但是一旦到达2018年的数据,分组就会混乱,“Week_Start”成为星期一。所以列表如下:

|---------------------|------------------|
|      Week_Start     | Total_Weekly_Sum |
|---------------------|------------------|
|    12/17/17         |         2        |
|---------------------|------------------|
|    12/24/18         |         5        |
|---------------------|------------------|
|    12/31/18         |         3        |<< Sunday
|---------------------|------------------|
|    01/01/18         |         1        |<< Monday
|---------------------|------------------|
|    01/08/18         |         4        |<< Monday
|---------------------|------------------|
|    01/15/18         |         8        |
|---------------------|------------------|

如何解决此问题?

1 个答案:

答案 0 :(得分:0)

我发现了这个问题。我的发言是发现本周的第一周。我取代了这个:

DATEADD(WEEK, DATEPART(WEEK,a.DATE_NOTIME)-1, DATEADD(YEAR, DATEDIFF(YEAR, 0, a.DATE_NOTIME), 0))

使用:

DATEADD(DAY,-1,DATEADD(WEEK,DATEDIFF(WEEK,0,a.DATE_NOTIME),0))

现在它适用于任何一年!希望它可以帮助有需要的人。