Sql 窗口分区函数需要帮助
我有一个包含本年度所有薪酬记录的数据集。我想加上一年和一个月,希望不必分别求和,然后加入结果。以下是我的数据:Sql 窗口分区函数需要帮助,sql,sql-server,Sql,Sql Server,我有一个包含本年度所有薪酬记录的数据集。我想加上一年和一个月,希望不必分别求和,然后加入结果。以下是我的数据: CREATE TABLE [dbo].[_Test]( [Id] [int] IDENTITY(1,1) NOT NULL, [EmployeeID] [nvarchar](30) NULL, [CheckDate] [date] NULL, [Units] [decimal](19, 5) NULL, [Rate] [decimal](19,
CREATE TABLE [dbo].[_Test](
[Id] [int] IDENTITY(1,1) NOT NULL,
[EmployeeID] [nvarchar](30) NULL,
[CheckDate] [date] NULL,
[Units] [decimal](19, 5) NULL,
[Rate] [decimal](19, 5) NULL,
[Amount] [decimal](19, 5) NULL,
[TaxAmount] [decimal](19, 5) NULL,
[DeductAmount] [decimal](19, 5) NULL,
[BenefitAmount] [decimal](19, 5) NULL
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[_Test] ON
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (1, N'1', CAST(N'2015-01-01' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(10.00000 AS Decimal(19, 5)), CAST(400.00000 AS Decimal(19, 5)), CAST(100.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (2, N'2', CAST(N'2015-01-01' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(12.00000 AS Decimal(19, 5)), CAST(480.00000 AS Decimal(19, 5)), CAST(120.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (3, N'1', CAST(N'2015-02-01' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(10.00000 AS Decimal(19, 5)), CAST(400.00000 AS Decimal(19, 5)), CAST(100.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (4, N'2', CAST(N'2015-02-01' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(12.00000 AS Decimal(19, 5)), CAST(480.00000 AS Decimal(19, 5)), CAST(120.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (5, N'1', CAST(N'2015-03-01' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(10.00000 AS Decimal(19, 5)), CAST(400.00000 AS Decimal(19, 5)), CAST(100.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (6, N'2', CAST(N'2015-03-01' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(12.00000 AS Decimal(19, 5)), CAST(480.00000 AS Decimal(19, 5)), CAST(120.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (7, N'1', CAST(N'2015-04-01' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(10.00000 AS Decimal(19, 5)), CAST(400.00000 AS Decimal(19, 5)), CAST(100.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (8, N'2', CAST(N'2015-04-01' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(12.00000 AS Decimal(19, 5)), CAST(480.00000 AS Decimal(19, 5)), CAST(120.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (9, N'1', CAST(N'2015-05-01' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(10.00000 AS Decimal(19, 5)), CAST(400.00000 AS Decimal(19, 5)), CAST(100.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (10, N'2', CAST(N'2015-05-01' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(12.00000 AS Decimal(19, 5)), CAST(480.00000 AS Decimal(19, 5)), CAST(120.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (11, N'1', CAST(N'2015-06-01' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(10.00000 AS Decimal(19, 5)), CAST(400.00000 AS Decimal(19, 5)), CAST(100.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (12, N'2', CAST(N'2015-06-01' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(12.00000 AS Decimal(19, 5)), CAST(480.00000 AS Decimal(19, 5)), CAST(120.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (13, N'1', CAST(N'2015-07-01' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(10.00000 AS Decimal(19, 5)), CAST(400.00000 AS Decimal(19, 5)), CAST(100.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (14, N'2', CAST(N'2015-07-01' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(12.00000 AS Decimal(19, 5)), CAST(480.00000 AS Decimal(19, 5)), CAST(120.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (15, N'1', CAST(N'2015-08-01' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(10.00000 AS Decimal(19, 5)), CAST(400.00000 AS Decimal(19, 5)), CAST(100.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (16, N'2', CAST(N'2015-08-01' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(12.00000 AS Decimal(19, 5)), CAST(480.00000 AS Decimal(19, 5)), CAST(120.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (17, N'1', CAST(N'2015-09-01' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(10.00000 AS Decimal(19, 5)), CAST(400.00000 AS Decimal(19, 5)), CAST(100.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (18, N'2', CAST(N'2015-09-01' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(12.00000 AS Decimal(19, 5)), CAST(480.00000 AS Decimal(19, 5)), CAST(120.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (19, N'1', CAST(N'2015-01-15' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(10.00000 AS Decimal(19, 5)), CAST(400.00000 AS Decimal(19, 5)), CAST(100.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (20, N'2', CAST(N'2015-01-15' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(12.00000 AS Decimal(19, 5)), CAST(480.00000 AS Decimal(19, 5)), CAST(120.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (21, N'1', CAST(N'2015-02-15' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(10.00000 AS Decimal(19, 5)), CAST(400.00000 AS Decimal(19, 5)), CAST(100.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (22, N'2', CAST(N'2015-02-15' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(12.00000 AS Decimal(19, 5)), CAST(480.00000 AS Decimal(19, 5)), CAST(120.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (23, N'1', CAST(N'2015-03-15' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(10.00000 AS Decimal(19, 5)), CAST(400.00000 AS Decimal(19, 5)), CAST(100.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (24, N'2', CAST(N'2015-03-15' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(12.00000 AS Decimal(19, 5)), CAST(480.00000 AS Decimal(19, 5)), CAST(120.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (25, N'1', CAST(N'2015-04-15' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(10.00000 AS Decimal(19, 5)), CAST(400.00000 AS Decimal(19, 5)), CAST(100.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (26, N'2', CAST(N'2015-04-15' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(12.00000 AS Decimal(19, 5)), CAST(480.00000 AS Decimal(19, 5)), CAST(120.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (27, N'1', CAST(N'2015-05-15' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(10.00000 AS Decimal(19, 5)), CAST(400.00000 AS Decimal(19, 5)), CAST(100.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (28, N'2', CAST(N'2015-05-15' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(12.00000 AS Decimal(19, 5)), CAST(480.00000 AS Decimal(19, 5)), CAST(120.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (29, N'1', CAST(N'2015-06-15' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(10.00000 AS Decimal(19, 5)), CAST(400.00000 AS Decimal(19, 5)), CAST(100.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (30, N'2', CAST(N'2015-06-15' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(12.00000 AS Decimal(19, 5)), CAST(480.00000 AS Decimal(19, 5)), CAST(120.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (31, N'1', CAST(N'2015-07-15' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(10.00000 AS Decimal(19, 5)), CAST(400.00000 AS Decimal(19, 5)), CAST(100.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (32, N'1', CAST(N'2015-08-15' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(10.00000 AS Decimal(19, 5)), CAST(400.00000 AS Decimal(19, 5)), CAST(100.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)), CAST(50.00000 AS Decimal(19, 5)))
GO
INSERT [dbo].[_Test] ([Id], [EmployeeID], [CheckDate], [Units], [Rate], [Amount], [TaxAmount], [DeductAmount], [BenefitAmount]) VALUES (33, N'2', CAST(N'2015-08-15' AS Date), CAST(40.00000 AS Decimal(19, 5)), CAST(12.00000 AS Decimal(19, 5)), CAST(480.00000 AS Decimal(19, 5)), CAST(120.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)), CAST(60.00000 AS Decimal(19, 5)))
GO
SET IDENTITY_INSERT [dbo].[_Test] OFF
GO
我想返回工资支票的数据,以及给定一个日期时包含的月至今值和年至今值。我想这样可能行得通,但我的窗口设置有问题
select employeeid, CheckDate, Units
sum(Units) over (Partition by employeeid, CheckDate
ORDER BY CheckDate
ROWS between unbounded preceding and current row) [MTD Units],
sum(Units) over (Partition by EmployeeId, CheckDate
ORDER BY CheckDate
ROWS between unbounded preceding and current row) [YTD Units],
, Rate, Amount,
sum(Amount) over (Partition by employeeid, CheckDate
ORDER BY CheckDate
ROWS between unbounded preceding and current row) [MTD Amount],
sum(Amount) over (Partition by EmployeeId, CheckDate
ORDER BY CheckDate
ROWS between unbounded preceding and current row) [YTD Amount],
from _Test
where CheckDate = '6/15/15'
我考虑使用Over的原因是可行的,因为如果我去掉WHERE子句并执行以下操作,我会得到每行上所有项目的总和
select employeeid, CheckDate, Units
, Rate, Amount
,sum(Amount) over (Partition by EmployeeId) [All]
from _Test
empidCheckDate Units Rate Amount All
1 2015-01-01 40.00 10.00 400.00 6800.00
1 2015-02-01 40.00 10.00 400.00 6800.00
1 2015-03-01 40.00 10.00 400.00 6800.00
2 2015-01-15 40.00 12.00 480.00 7680.00
2 2015-02-15 40.00 12.00 480.00 7680.00
2 2015-03-15 40.00 12.00 480.00 7680.00
我在想我可以用窗户限制它
我期望的输出如下:
Id EmpID CheckDate Units MTD Units YTD Units Rate Amount MTD Amount YTD Amount TaxAmount DeductAmount BenefitAmount
29 1 2015-06-15 40.00 80.00 520.00 10.00 400.00 800.00 5200.00 100.00 50.00 50.00
30 2 2015-06-15 40.00 80.00 520.00 12.00 480.00 960.00 6240.00 120.00 60.00 60.00
有什么想法吗
谢谢
Brian应该只需要按调整您的
分区,以在年和/或月之前将其分开:
select employeeid, CheckDate, Units,
sum(Units) over (Partition by employeeid, YEAR(CheckDate),MONTH(CheckDate)
ORDER BY CheckDate
ROWS between unbounded preceding and current row) [MTD Units],
sum(Units) over (Partition by EmployeeId, YEAR(CheckDate)
ORDER BY CheckDate
ROWS between unbounded preceding and current row) [YTD Units],
, Rate, Amount,
sum(Amount) over (Partition by employeeid, YEAR(CheckDate),MONTH(CheckDate)
ORDER BY CheckDate
ROWS between unbounded preceding and current row) [MTD Amount],
sum(Amount) over (Partition by EmployeeId, YEAR(CheckDate)
ORDER BY CheckDate
ROWS between unbounded preceding and current row) [YTD Amount],
from _Test
这样,您创建的运行总额将被限制在适当的时间段内,您不希望将上个月的金额添加到本月的运行总额中。如果只需要特定日期的值,则在计算YTD和MTD后,需要使用子查询/cte进行筛选,因为如果将筛选器放在同一查询中,则无法使用必要的金额进行聚合:
;with cte AS (select employeeid, CheckDate, Units,
sum(Units) over (Partition by employeeid, YEAR(CheckDate),MONTH(CheckDate)
ORDER BY CheckDate
ROWS between unbounded preceding and current row) [MTD Units],
sum(Units) over (Partition by EmployeeId, YEAR(CheckDate)
ORDER BY CheckDate
ROWS between unbounded preceding and current row) [YTD Units],
, Rate, Amount,
sum(Amount) over (Partition by employeeid, YEAR(CheckDate),MONTH(CheckDate)
ORDER BY CheckDate
ROWS between unbounded preceding and current row) [MTD Amount],
sum(Amount) over (Partition by EmployeeId, YEAR(CheckDate)
ORDER BY CheckDate
ROWS between unbounded preceding and current row) [YTD Amount],
from _Test
)
SELECT *
FROM cte
WHERE CheckDate = '6/15/15'
编辑:最初仅调整了金额
计算,添加的单位
只需按
调整您的分区,按年
和/或月
将其分开:
select employeeid, CheckDate, Units,
sum(Units) over (Partition by employeeid, YEAR(CheckDate),MONTH(CheckDate)
ORDER BY CheckDate
ROWS between unbounded preceding and current row) [MTD Units],
sum(Units) over (Partition by EmployeeId, YEAR(CheckDate)
ORDER BY CheckDate
ROWS between unbounded preceding and current row) [YTD Units],
, Rate, Amount,
sum(Amount) over (Partition by employeeid, YEAR(CheckDate),MONTH(CheckDate)
ORDER BY CheckDate
ROWS between unbounded preceding and current row) [MTD Amount],
sum(Amount) over (Partition by EmployeeId, YEAR(CheckDate)
ORDER BY CheckDate
ROWS between unbounded preceding and current row) [YTD Amount],
from _Test
这样,您创建的运行总额将被限制在适当的时间段内,您不希望将上个月的金额添加到本月的运行总额中。如果只需要特定日期的值,则在计算YTD和MTD后,需要使用子查询/cte进行筛选,因为如果将筛选器放在同一查询中,则无法使用必要的金额进行聚合:
;with cte AS (select employeeid, CheckDate, Units,
sum(Units) over (Partition by employeeid, YEAR(CheckDate),MONTH(CheckDate)
ORDER BY CheckDate
ROWS between unbounded preceding and current row) [MTD Units],
sum(Units) over (Partition by EmployeeId, YEAR(CheckDate)
ORDER BY CheckDate
ROWS between unbounded preceding and current row) [YTD Units],
, Rate, Amount,
sum(Amount) over (Partition by employeeid, YEAR(CheckDate),MONTH(CheckDate)
ORDER BY CheckDate
ROWS between unbounded preceding and current row) [MTD Amount],
sum(Amount) over (Partition by EmployeeId, YEAR(CheckDate)
ORDER BY CheckDate
ROWS between unbounded preceding and current row) [YTD Amount],
from _Test
)
SELECT *
FROM cte
WHERE CheckDate = '6/15/15'
编辑:最初仅调整了金额
计算,增加了单位
您可以将标题重新格式化为问题吗?您可以将标题重新格式化为问题吗?我不能创建一个第一季度窗口,例如,包含“1/1/15”和“3/31/15”之间的窗口吗?如果是这样,那么我就不需要MTD的子查询了,YTD?我想我尝试的方法是,给我所有的记录(即YTD)和窗口当前和窗口MTD的开始/结束日期。我不确定我是否完全按照问题,但你可以用DATEPART(quarty,CheckDate)
获得季度。如果要显示的天数少于计算窗口中包含的整个天数范围,则只需要子查询。这就清楚了吗?比如,我不能创建一个包含“1/1/15”和“3/31/15”之间的第一季度窗口吗?如果是这样,那么我就不需要MTD的子查询了,YTD?我想我尝试的方法是,给我所有的记录(即YTD)和窗口当前和窗口MTD的开始/结束日期。我不确定我是否完全按照问题,但你可以用DATEPART(quarty,CheckDate)
获得季度。如果要显示的天数少于计算窗口中包含的整个天数范围,则只需要子查询。这能把事情弄清楚吗?