【问题标题】:How to aggregate totals for a given week and each respective weekday?如何汇总给定一周和每个工作日的总数?
【发布时间】:2016-09-26 21:08:05
【问题描述】:

我目前正在尝试构建一个逻辑,该逻辑将根据报告的运行日期独立汇总当前一周的每一天。我需要弄清楚如何构建一个查询以将每一天(以及每周总和)聚合为单独的列。

下面我只提供了用于 Total 和 Sunday 的子查询:

DECLARE 
@SundayOfCurrentWeek date
, @MondayOfCurrentWeek  date
, @TuesdayOfCurrentWeek  date
, @WednesdayOfCurrentWeek date
, @ThursdayOfCurrentWeek date
, @FridayOfCurrentWeek date
, @SaturdayOfCurrentWeek date
set @SundayOfCurrentWeek = DATEADD(wk, DATEDIFF(wk,0,getdate()), -1)
set @MondayOfCurrentWeek =  DATEADD(wk, DATEDIFF(wk,0,getdate()), 0) 
set @TuesdayOfCurrentWeek =  DATEADD(wk, DATEDIFF(wk,0,getdate()), 1) 
set @WednesdayOfCurrentWeek =  DATEADD(wk, DATEDIFF(wk,0,getdate()), 2) 
set @ThursdayOfCurrentWeek =  DATEADD(wk, DATEDIFF(wk,0,getdate()), 3) 
set @FridayOfCurrentWeek =  DATEADD(wk, DATEDIFF(wk,0,getdate()), 4) 
set @SaturdayOfCurrentWeek =  DATEADD(wk, DATEDIFF(wk,0,getdate()), 5)

/** 选择一周内的总记录**/

( select count(*) 
from release 
where releasetime >= @SundayOfCurrentWeek 
AND releasetime <= @SaturdayOfCurrentWeek ) as TotalCount 

/** 选择截至周日的所有记录**/

( select count(*) as SundayCount
from release 
where releasetime >= @SundayOfCurrentWeek 
AND releasetime < @MondayOfCurrentWeek ) as SundayCount

【问题讨论】:

    标签: sql sql-server tsql count aggregate


    【解决方案1】:
    ;WITH cte AS (
        SELECT
           DATENAME(dw,releasetime) as DayOfWeekName
           ,COUNT(*) OVER () as TotalCount
        FROM
           @release
        WHERE
           releasetime >= DATEADD(DAY,- DATEPART(dw,GETDATE()) + 1,CAST(GETDATE() AS DATE)) 
           AND releasetime < DATEADD(DAY,7 - DATEPART(dw,GETDATE()) + 1,CAST(GETDATE() AS DATE))
    )
    
    SELECT *
    FROM
        cte
        PIVOT (
           COUNT(DayOfWeekName)
           FOR DayOfWeekName IN (Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday)
        ) p
    

    有很多不同的方法。我假设您希望结果在星期几列中而不是在行中旋转。因此,我向您展示了一种透视结果的方法。您也可以像在另一个答案中一样使用条件聚合。使用 Pivot 的技巧是先准备好您想要的表,然后再进行旋转,这可以使用通用表表达式 [cte] 来完成。然后使用窗口函数,您可以轻松获得 COUNT(*) 的总计数,甚至是运行计数。

    总数 COUNT(*) OVER () --note 没有分区和没有 order by 语句只是对结果集进行计数。

    运行计数可能如下所示:

    COUNT(*) OVER (ORDER BY DATEPART(dw,releasetime))
    

    绝对推荐熟悉窗口函数!

    编辑,更改 where 语句中的日期比较。它会自动计算出本周的星期日,然后是下周的星期日。下周星期日的原因是我将它从 &lt;= 切换到 &lt; 因为 SQL Server 会将高于 23:59:59.997 的任何内容舍入到第二天的 00:00:00.000 你要么必须将结束日期设为午夜如果发布时间包含时间部分,或者您将其设为第二天上午 12 点并说小于,则为星期六。

    【讨论】:

      【解决方案2】:

      试试这个...

      SELECT 
      DATEPART(DW, [date_col]) AS 'Day_of_Week', 
      COUNT(*) AS 'Count_per_Day'
      FROM [Table]
      GROUP BY DATEPART(DW, [date_col])
      

      请注意,Day_of_Week = 1 表示周日,7 表示周六。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-02
        • 1970-01-01
        • 1970-01-01
        • 2018-01-13
        • 1970-01-01
        • 2016-02-08
        • 1970-01-01
        相关资源
        最近更新 更多