我正在使用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
....
这些示例片段应为您提供执行此操作所需的基本格式。