一个表或视图中的各种汇总日期 - SQL Server v14



我正在使用SQL Server v14,并正在尝试创建摘要视图或表(我是SQL新手,所以请放轻松)。我附加了一些示例数据,我想从中创建另一个包含以下列的表(如下)。

我无法将多个日期字段汇总到一个表中,因为"where"语句只会捕获其中一个。如何在表中创建多个汇总列?如何为每列创建多个 WHERE 字段?

示例数据列标题(输入)

USID|      Job_Desc|    Grouping Designation|     hoursdate|    hours
USBUGBY    None         DIRECT                    1/21/2019     5    
US76546    None         DIRECT                    12/31/2018    6
US76546    None         DIRECT                    12/31/2018    6
US73546    None         CTE                       2/28/2019     6
US73546    None         CTE                       2/28/2019     6

期望输出:

USID    MTD Hours    Rolling Hours    Current Month Hours

列逻辑

  • 美国伊德
  • MTD 小时数 - 上个月,所以如果今天是 2/1,它应该显示 1 月
  • 滚动时间 - -12 个月到上个月
  • 当前月份小时数 - 当前月份(因此,如果今天是 1/21,这将是整个 1 月)
  • 下个月营业时间(例如:2 月)

将多个摘要轻松放入不同列的方法是使用子查询。例如:

DECLARE @dt date
SET @dt = '20190201' -- Easiest if this is set to the 1st of the current month
                     -- Otherwise, calculate the 1st of month.
SELECT
    USID
    (
        SELECT Sum(hours) 
        FROM MyTable mt
        WHERE mt.HoursDate >= DATEADD(Month, -1, @dt) 
            AND mt.HoursDate < @dt
            AND mt.USID = m.USID
    ) Prior_MTD_Hours, -- Prior Month, so if today is 2/1 it should show January
    (
        SELECT Sum(hours) 
        FROM MyTable mt
        WHERE HoursDate >= DATEADD(Month, -12, @dt) 
            AND HoursDate < @dt
            AND mt.USID = m.USID
    ) Rolling Hours, --12 month to Prior Month
    (
        SELECT Sum(hours) 
        FROM MyTable mt
        WHERE HoursDate >= @dt 
            AND HoursDate < Dateadd(Month, 1, @dt)
            AND mt.USID = m.USID
    ) Current Month Hours, -- Current Month (so if today is 1/21, this would be all of January)
    (
        SELECT Sum(hours) 
        FROM MyTable mt
        WHERE HoursDate >= DATEADD(Month, 1, @dt) 
            AND HoursDate < Dateadd(Month, 2, @dt)
            AND mt.USID = m.USID
    ) Next Month Hours 
FROM MyTable m

这是您正在寻找的基本框架。显然,您还将在内部查询中添加所需的任何其他分组。

还有其他

方法也可以完成此操作,例如将子查询用作派生表:

SELECT ...
FROM Mytable m
LEFT JOIN (
        SELECT USID, Sum(hours) as PriorMthHrs
        FROM MyTable mt
        WHERE mt.HoursDate >= DATEADD(Month, -1, @dt) 
            AND mt.HoursDate < @dt
        GROUP BY USID
    ) as mp
    ON mp.USID = m.usid
LEFT JOIN (
        SELECT USID, Sum(hours) 
        FROM MyTable mt
        WHERE HoursDate >= DATEADD(Month, -12, @dt) 
            AND HoursDate < @dt
            AND mt.USID = m.USID
        GROUP BY USID
    ) as mr
    ON mr.USID = m.usid
....

这些示例片段应为您提供执行此操作所需的基本格式。

最新更新