Как создать имя месяца в виде столбца для диапазона дат за предыдущий месяц до следующих 5 месяцев динамически на сервере SQL - PullRequest
0 голосов
/ 28 сентября 2018

Как динамически создать имя месяца в виде столбца для диапазона дат за предыдущий месяц и следующие 5 месяцев на сервере sql.

Я хочу получить данные за 6 месяцев (с предыдущего месяца до следующих 5 месяцев, т.е. с августа 2018 года по январь 2019 года) на основе текущего месяца.предположим, что если я выполню тот же запрос в следующем октябрьском месяце, то данные за 6 месяцев должны быть с 2018 по 2019 февраль, а названия месяцев должны динамически рассматриваться как имена столбцов.

таблица:

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.

1 Ответ

0 голосов
/ 28 сентября 2018

CREATE TABLE #temp ([месяцы] varchar NULL,)

объявить @i int set @ i = -1, а (@i <5) начать вставку в значения #temp (Datename (month, DATEADD)(MONTH, DATEDIFF (MONTH, 0, GETDATE ()) + @ i, 0))) set @ i = @ i + 1 end </p>

select * from # temp

...