2017-05-03 3 views
0

Ich habe eine Auswahlabfrage Bericht wie dieserDynamische SQL-Datum Realisie- rung für Spalten und Bestellung

EmpID Title M1 M2 M3 M4 M5 M6 M7 M8 M9 M10 M11 M12 
1  PM 
2  BA 
3  QA 

EmpID und Title aus dem Emp Tisch kommen und alle M1-M12 kommen aus Code Tabelle

M1 ist immer Januar, M2 ist immer Februar ... M12 immer Dezember usw.

Wenn ich diese Abfrage auf 1 2017 Mai ausführen, werde ich

EmpID Title 2016-05-1 2016-06-1 2016-07-1 2016-08-1 2016-09-1 2016-010-1 2016-11-1 2016-12-1 2017-01-1 2017-02-1 2017-03-1 2017-04-1 
1  PM 
2  BA  
3  QA 

Das heißt,

EmpID Title M5 M6 M7 M8 M9 M10 M11 M12 M1 M2 M3 M4 
1  PM 
2  BA  
3  QA 

Wenn ich diese Abfrage am 1. Juni ausführen 2017 erhalten haben, werde ich bekommen müssen

EmpID Title 2016-06-1 2016-07-1 2016-08-1 2016-09-1 2016-010-1 2016-11-1 2016-12-1 2017-01-1 2017-02-1 2017-03-1 2017-04-1 2017-05-1 
1  PM 
2  BA  
3  QA 

Das bedeutet:

EmpID Title M6 M7 M8 M9 M10 M11 M12 M1 M2 M3 M4 M5 
1  PM 
2  BA  
3  QA 

Ich habe eine temporäre Tabelle erstellt und fallen alle erforderlichen Monat in diesem

Select * 
Into #TempDates 
From 
    (Select 
     MyDate = convert(date, DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 1, 0)) 
    union all----Current month-1 
    Select x2 = convert(date, DATEADD(MONTH, DATEDIFF(MONTH, 1, GETDATE()) - 2, 0)) 
    union all----Current month-2 
    Select x3 = convert(date, DATEADD(MONTH, DATEDIFF(MONTH, 2, GETDATE()) - 3, 0)) 
    union all--Current month-3 
    Select x4 = convert(date, DATEADD(MONTH, DATEDIFF(MONTH, 2, GETDATE()) - 4, 0)) 
    union all--Current month-4 
select x5=convert(date,DATEADD(MONTH, DATEDIFF(MONTH, 2, GETDATE())-5, 0)) union all--Current month-5 
select x6=convert(date,DATEADD(MONTH, DATEDIFF(MONTH, 2, GETDATE())-6, 0)) union all--Current month-6 
select x7=convert(date,DATEADD(MONTH, DATEDIFF(MONTH, 2, GETDATE())-7, 0)) union all--Current month-7 
select x8=convert(date,DATEADD(MONTH, DATEDIFF(MONTH, 2, GETDATE())-8, 0)) union all--Current month-8 
select x9=convert(date,DATEADD(MONTH, DATEDIFF(MONTH, 2, GETDATE())-9, 0)) union all--Current month-9 
select x10=convert(date,DATEADD(MONTH, DATEDIFF(MONTH, 2, GETDATE())-10, 0)) union all--Current month-10 
select x11=convert(date,DATEADD(MONTH, DATEDIFF(MONTH, 2, GETDATE())-11, 0)) union all--Current month-11 
select x12=convert(date,DATEADD(MONTH, DATEDIFF(MONTH, 2, GETDATE())-12, 0))--Current month-12 
) AS X 

ich einen Bericht wie folgt gesucht:

Select 
    Emp.EmpID as 'Employee ID', 
    Emp.Title as 'Employee Title', 
    Code.M1 as (Select Mydate from #TempDates where datepart(month, Mydate) = 1), 
    Code.M2 as (Select Mydate from #TempDates where datepart(month, Mydate) = 2), 
    Code.M3 as (Select Mydate from #TempDates where datepart(month, Mydate) = 3) 
    . 
    . 
    . 
    Code.M12 as (Select Mydate from #TempDates where datepart(month, Mydate) = 12) 
From 
    Emp 
Join 
    Code on Emp.ID = Code.ID 
Order by 
    Mydate asc 

Könnte jemand bitte helfen Sie mir dies zu tun? Ich weiß nicht, wie man das Datum mit Spaltennamen aliasiert. Ich bin mit SQL Server 2014

Vielen Dank Zeit nehmen, meine Frage und vielen Dank für Ihre Hilfe

Antwort

1

Zuerst zu lesen, erzeuge ich die Daten-Tabellen auf diese Weise:

SELECT X, CONVERT(VARCHAR(10), MyDate,101) MyDate INTO #dates 
FROM (SELECT DATEADD(MONTH, mth.x, CAST(GETDATE() AS DATE)) MyDate, mth.x + 1 as X 
     FROM (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11)) mth(x)) M; 

Es produziert das nächste Ergebnis:

SELECT * FROM #dates; 

 
    X | MyDate
-: | :--------- 1 | 05/03/2017 2 | 06/03/2017 3 | 07/03/2017 4 | 08/03/2017 5 | 09/03/2017 6 | 10/03/2017 7 | 11/03/2017 8 | 12/03/2017 9 | 01/03/2018 10 | 02/03/2018 11 | 03/03/2018 12 | 04/03/2018

Now, I've set up a reduced example:

CREATE TABLE #Emp(EmpID int, Title varchar(10)); 
INSERT INTO #Emp VALUES (1,'PM'),(2,'BA'),(3,'QA'); 
CREATE TABLE #Code(ID int, M1 int, M2 int, M3 int, M4 int, M5 int, M6 int, M7 int, M8 int, M9 int, M10 int, M11 int, M12 int); 
INSERT INTO #Code VALUES 
(1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), 
(2, 11, 21, 31, 41, 51, 61, 71, 81, 91, 101, 111, 121), 
(3, 21, 22, 23, 24, 25, 26, 27, 28, 29, 210, 211, 212); 

DECLARE @rows nvarchar(max); 
SET @rows = STUFF((SELECT distinct ',' + ('M' + CAST(X as varchar(10)) + ' AS ' + QUOTENAME(MyDate)) 
        FROM (SELECT TOP 100 PERCENT X, MyDate FROM #dates ORDER BY X) t 
      FOR XML PATH(''), TYPE 
      ).value('.', 'nvarchar(MAX)') 
      ,1,1,''); 

DECLARE @cmd nvarchar(max); 
SET @cmd = 'SELECT EmpID, Title, ' + @rows + ' FROM #Emp INNER JOIN #Code ON #Emp.EmpID = #Code.ID'; 
SELECT @cmd; 

EXEC (@cmd); 
GO 

Dies ist die erzeugte Abfrage:

SELECT EmpID, 
     Title, 
     M1 AS [05/03/2017], 
     M2 AS [06/03/2017], 
     M3 AS [07/03/2017], 
     M4 AS [08/03/2017], 
     M5 AS [09/03/2017], 
     M6 AS [10/03/2017], 
     M7 AS [11/03/2017], 
     M8 AS [12/03/2017], 
     M9 AS [01/03/2018], 
     M10 AS [02/03/2018], 
     M11 AS [03/03/2018], 
     M12 AS [04/03/2018] 
FROM #Emp 
INNER JOIN #Code 
ON #Emp.EmpID = #Code.ID 
EmpID | Title | 05/03/2017 | 06/03/2017 | 07/03/2017 | 08/03/2017 | 09/03/2017 | 10/03/2017 | 11/03/2017 | 12/03/2017 | 01/03/2018 | 02/03/2018 | 03/03/2018 | 04/03/2018 
----: | :---- | ---------: | ---------: | ---------: | ---------: | ---------: | ---------: | ---------: | ---------: | ---------: | ---------: | ---------: | ---------: 
    1 | PM |   1 |   2 |   3 |   4 |   5 |   6 |   7 |   8 |   9 |   10 |   11 |   12 
    2 | BA |   11 |   21 |   31 |   41 |   51 |   61 |   71 |   81 |   91 |  101 |  111 |  121 
    3 | QA |   21 |   22 |   23 |   24 |   25 |   26 |   27 |   28 |   29 |  210 |  211 |  212 

dbfiddle here

+0

Vielen Dank McNets für Ihre großartige Hilfe. Ich werde es versuchen und dich wissen lassen – Please