2016-10-12 20 views
2

Ich habe eine FormSummary Tabelle:PIVOT und duplizieren einige Spalten einer Tabelle

formID formName Version ReleaseDate Location 
======================================================== 
AA-01  PAYMENTS 1.3   1/1/2012  CA 
AA-02  LOANS  1.4   2/1/2012  CA 
AA-03  ADVANCES 1.6   3/20/2012  CA 
AA-01  PAYMENTS 1.2   12/1/2011  US 
AA-02  LOANS  1.4   2/1/2012  US 
AA-03  ADVANCES 1.6   3/20/2012  US 
AA-01  PAYMENTS 1.3   12/1/2012  PH 
AA-02  LOANS  1.4   2/1/2012  PH 
AA-03  ADVANCES 1.5   2/14/2012  PH 

Wie kann ich die location Spalte schwenken, so dass ich mit der folgenden Ausgabe einfiel:

formID formName Version (CA) ReleaseDate (CA) Version (US) ReleaseDate (US) Version (PH) ReleaseDate (PH) 
============================================================================================================================== 
AA-01  PAYMENTS 1.3    1/1/2012   1.2    12/1/2011   1.3    12/1/2012 
AA-02  LOANS  1.4    2/1/2012   1.4    2/1/2012   1.4    2/1/2012 
AA-03  ADVANCES 1.6    3/20/2012   1.6    3/20/2012   1.5    2/14/2012 

Script Tabelle erstellen:

CREATE TABLE #FormSummary (
    formID nvarchar(5), 
    formName nvarchar(max), 
    [Version] float, 
    ReleaseDate date, 
    [Location] nvarchar(2) 
) 

INSERT INTO #FormSummary VALUES 
('AA-01', 'PAYMENTS', 1.3, '1/1/2012', 'CA'), 
('AA-02', 'LOANS', 1.4, '2/1/2012', 'CA'), 
('AA-03', 'ADVANCES', 1.6, '3/20/2012', 'CA'), 
('AA-01', 'PAYMENTS', 1.2, '12/1/2011', 'US'), 
('AA-02', 'LOANS', 1.4, '2/1/2012', 'US'), 
('AA-03', 'ADVANCES', 1.6, '3/20/2012', 'US'), 
('AA-01', 'PAYMENTS', 1.3, '12/1/2012', 'PH'), 
('AA-02', 'LOANS', 1.4, '2/1/2012', 'PH'), 
('AA-03', 'ADVANCES', 1.5, '2/14/2012', 'PH') 
+1

Dies scheint wie eine grundlegende dynamische Pivot-Aufgabe. Schauen Sie sich Stack Overflow an und Sie werden eine Lösung finden. –

+0

@EvaldasBuinauskas Ja, aber ich konnte keine Artikel über dynamische Pivots mit getrennten Spalten finden, die auf geschwenkten Feldern basieren. –

Antwort

2

Bei der ersten Verwendung sys.columns Tabelle zu obt ain Spaltennamen. Dann CROSS sie mit Location s JOIN Spaltennamen wie

,[Version (CA)],[ReleaseDate (CA)],[Version (PH)],[ReleaseDate (PH)],[Version (US)],[ReleaseDate (US)] 

Dann UNPIVOT erhalten verwenden, um Tabelle wie folgt aussehen:

formID formName Columns    Values 
AA-01 PAYMENTS Version (CA)  1.3 
AA-01 PAYMENTS ReleaseDate (CA) 2012-01-01 
AA-02 LOANS  Version (CA)  1.4 
... 
AA-03 ADVANCES Version (PH)  1.5 
AA-03 ADVANCES ReleaseDate (PH) 2012-02-14 

dann PIVOT mit Spaltennamen in gespeichert verwenden @col

Diese Skript gibt Ihnen, was Sie brauchen:

DECLARE @sql nvarchar(max), 
     @col nvarchar(max) 

SELECT @col = (
    SELECT ',' + QUOTENAME([name]+ ' ('+[Location]+')') 
    FROM sys.columns c 
    CROSS JOIN (
     SELECT DISTINCT [Location] 
     FROM #FormSummary 
     ) as f 
    WHERE c.[object_id] = OBJECT_ID(N'#FormSummary') and c.column_id > 2 and [name] != 'Location' 
    ORDER BY [Location] 
    FOR XML PATH('') 
) 

SELECT @sql = N' 
SELECT * 
FROM (
    SELECT formID, 
      formName, 
      [Columns] + '' (''+[Location]+'')'' as [Columns], 
      [Values] 
    FROM (
     SELECT formID, 
       formName, 
       CAST([Version] as nvarchar(max)) [Version], 
       CAST(ReleaseDate as nvarchar(max)) ReleaseDate, 
       CAST([Location] as nvarchar(max)) [Location] 
     FROM #FormSummary 
    ) as t 
    UNPIVOT (
     [Values] FOR [Columns] IN ([Version], ReleaseDate) 
    ) as unpvt 
) as d 
PIVOT (
    MAX([Values]) FOR [Columns] IN ('+STUFF(@col,1,1,'')+') 
) as pvt' 

EXEC sp_executesql @sql 

Ausgabe:

formID formName Version (CA) ReleaseDate (CA) Version (PH) ReleaseDate (PH) Version (US) ReleaseDate (US) 
AA-03 ADVANCES 1.6    2012-03-20   1.5    2012-02-14   1.6    2012-03-20 
AA-02 LOANS  1.4    2012-02-01   1.4    2012-02-01   1.4    2012-02-01 
AA-01 PAYMENTS 1.3    2012-01-01   1.3    2012-12-01   1.2    2011-12-01 
+0

Genau das, was ich brauche. Ich danke dir sehr! –

Verwandte Themen