sql-server-2008 - 如何在sql server中动态创建月份名称作为上个月到下5个月的日期范围的列
问题描述
如何在 sql server 中动态创建月份名称作为上个月到下一个 5 个月的日期范围的列。
我想根据当月检索 6 个月的数据(上个月到下 5 个月,即 2018 年 8 月到 2019 年 1 月)。假设如果我在下一个 10 月运行相同的查询,那么 6 个月的数据应该是 2018 年 9 月到 2019 年 2 月,并且月份名称应该被动态地视为列名。
桌子 :
CREATE TABLE [dbo].[empproj](
[projectname] [varchar](50) NULL,
[empname] [varchar](50) NULL,
[startdate] [date] NULL,
[enddate] [date] NULL,
[projectstatus] [numeric](18, 2) NULL
)
GO
INSERT [dbo].[empproj] ([projectname], [empname], [startdate], [enddate], [projectstatus]) VALUES (N'p1', N'e1', CAST(N'2018-04-01' AS Date), CAST(N'2018-12-31' AS Date), CAST(1.00 AS Numeric(18, 2)))
go
INSERT [dbo].[empproj] ([projectname], [empname], [startdate], [enddate], [projectstatus]) VALUES (N'p1', N'e5', CAST(N'2014-02-01' AS Date), CAST(N'2019-01-31' AS Date), CAST(0.25 AS Numeric(18, 2)))
GO
INSERT [dbo].[empproj] ([projectname], [empname], [startdate], [enddate], [projectstatus]) VALUES (N'p2', N'e1', CAST(N'2017-01-01' AS Date), CAST(N'2019-03-30' AS Date), CAST(0.75 AS Numeric(18, 2)))
GO
基于上述数据,我希望按照当前月份运行查询,如下所示。
projectname |empname | August2018| September2018|October2018|November2018| December2018|January2019
p1 |e1 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 |0.0
p1 |e5 | 0.25 | 0.25 | 0.25 | 0.25 |0.25 |0.25
p2 |e1 | 0.75 | 0.75 | 0.75 |0.75 | 0.75 |0.75
如果在下个月(10 月)运行相同的查询,那么结果应该如下所示。
projectname |empname | September2018|October2018|November2018| December2018|January2019 |February2019
p1 |e1 | 1.0 | 1.0 | 1.0 | 1.0 |0.0 |0.0
p1 |e5 | 0.25 | 0.25 | 0.25 |0.25 |0.25 |0.0
p2 |e1 | 0.75 | 0.75 |0.75 | 0.75 |0.75 |0.75
我尝试如下:
declare @start DATE = (select DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, 0))
declare @end DATE = (select DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())+4, 0))
;with months (date)
AS
(
SELECT @start
UNION ALL
SELECT DATEADD(month,1,date)
from months
where DATEADD(month,1,date)<=@end
)
select Datename(month,date)months from months
我被逻辑困住了。
如何编写查询来实现此任务月份名称动态列,用于 sql server 中 6 个月的数据。
解决方案
创建表#temp([月] varchar NULL,)
声明 @i int set @i=-1 while(@i<5) 开始插入 #temp 值 (Datename(month,DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())+@i, 0)))设置@i=@i+1 结束
从#temp中选择*