如何在 SQL Server 中动态创建月份名称作为上个月到未来 5 个月的日期范围的列



如何在 SQL Server 中动态创建月份名称作为上个月到未来 5 个月的日期范围的列。

我想根据当月检索 6 个月数据(上个月到未来 5 个月,即 2018 年 8 月至 2019 年 1 月(。 假设如果我在下一个十月月运行相同的查询,那么 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

如果在下个月(十月(运行相同的查询,则结果应如下所示。

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

我被逻辑困住了。

如何编写查询以实现此任务 月份名称动态列 6 个月数据在 sql 服务器中。

创建表 #temp( [月] 瓦尔查尔空, )

声明@i int 设置@i=-1 而(@i<5( 开始 插入到 #temp 值中 (Datename(MONTH,DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE(((+@i, 0((( 设置@i=@i+1 结束

从 #temp 中选择 *

最新更新