Najpierw musisz UNPIVOT
nasze kolumny i użyj DENSE_RANK()
by dać ci coś, na czym możesz się później odwrócić. Umieść ten wynik w tabeli tymczasowej, aby uzyskać rozdzieloną przecinkami listę DESNSE_RANK
kolumny. Następnie utwórz UNION
aby Dzień
i Data
są częścią tej samej kolumny, co nieobrotowa. Można to umieścić w globalnej tabeli tymczasowej do użytku w dynamicznym SQL. Utwórz zmienną, która będzie przechowywać listę kolumn, zbuduje dynamiczny SQL i wykona go.
Pełny przykład (oczywiście nie upuszczaj PhaseFlowChart
tabela)
-- wstępne czyszczenieIF OBJECT_ID('[dbo].[PhaseFlowChart]') NIE JEST TABELĄ UPUSZCZANIA NULL [dbo].[PhaseFlowChart]GOIF ID_OBIEKTU('tempdb..#tmp') NIE JEST NULL DROP TABLE #tmpGOIF OBJECT_ID('tempdb..##tmp') NIE JEST NULL DROP TABLE ##tmpGO-- konfiguracja tabeli i dataCREATE TABLE [dbo].[PhaseFlowChart]( [pfckey] [int] NULL, [hourlykey] [bigint ] NULL, [daykey] [bigint] NULL, [weekkey] [int] NULL, [monthkey] [int] NULL, [bbkey] [int] NULL, [Dzień] [varchar] (100) NULL, [Data] [ varchar](100) NULL, [Bull Bear Gap] [varchar](100) NULL, [Miesięcznie] [varchar](100) NULL, [Tygodniowy] [varchar](100) NULL, [Codziennie] [varchar](100 ) NULL, [godzina 1] [varchar](100) NULL, [godzina 2] [varchar](100) NULL, [godzina 3] [varchar](100) NULL, [godzina 4] [varchar](100) NULL , [Godzina 5] [varchar](100) NULL, [Godzina 6] [varchar](100) NULL, [Godzina 7] [varchar](100) NULL) ON [PRIMARY]INSERT INTO [dbo].PhaseFlowChart ([ Dzień], [Data], [Bull Bear Gap], Miesięczny, Tygodniowy, Dzienny, [H nasze 1], [Godzina 2], [Godzina 3], [Godzina 4], [Godzina 5], [Godzina 6], [Godzina 7])WARTOŚCI('PON', '20130101', 'P1', 'P1 ', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1', 'P1'),('WT', '20130102', 'P2 ', 'P2', 'P2', 'P2', 'P2', 'P2', 'P2', 'P2', 'P2', 'P2', 'P2'),('ŚRO', '20130103 ', 'P3', 'P3', 'P3', 'P3', 'P3', 'P3', 'P3', 'P3', 'P3', 'P3', 'P3'),('CZW ', '20130104', 'P4', 'P4', 'P4', 'P4', 'P4', 'P4', 'P4', 'P4', 'P4', 'P4', 'P4') ,('Pt', '20130105', 'P5', 'P5', 'P5', 'P5', 'P5', 'P5', 'P5', 'P5', 'P5', 'P5', 'P5'),('SAT', '20130106', 'P6', 'P6', 'P6', 'P6', 'P6', 'P6', 'P6', 'P6', 'P6', 'P6', 'P6'),('SŁOŃCE', '20130107', 'P7', 'P7', 'P7', 'P7', 'P7', 'P7', 'P7', 'P7', 'P7', 'P7', 'P7')GO-- przestaw kolumny na 'kategorie'SELECT [Dzień], [Data], [Wartość], [Kategoria], DENSE_RANK() OVER (ORDER BY CAST([Data ] JAKO DATA)) dr INTO #tmpFROM PhaseFlowChart pfcUNPIVOT ( Wartość DLA Kategorii IN ([Przerwa Byka Niedźwiedzia], Miesięcznie, Co tydzień, Dziennie, [Godzina 1], [Godzina 2], [Godzina 3], [Godzina 4], [Godzina 5], [Godzina 6], [Godzina 7])) upiv-- utwórz globalną tabelę tymczasową do późniejszego użyciaSELECT *INTO ##tmpFROM ( -- łączenie danych w kolumnie pojedynczej kategorii SELECT 'Dzień' Kategoria, [dzień] Wartość, dr, 1 o FROM #tmp UNION ALL SELECT 'Data' Kategoria, [Data] Wartość, dr, 2 o FROM #tmp UNION ALL SELECT [Kategoria], Wartość, dr, 3 o FROM #tmp) t-- get oddzielona przecinkami lista kolumn dla PIVOTDECLARE @cols VARCHAR(MAX) =STUFF(CAST((SELECT ',' + QUOTENAME(dr) FROM ( SELECT DISTINCT dr FROM #tmp ) t ORDER BY dr FOR XML PATH('') , TYPE ) AS VARCHAR(MAX)),1,1,'')-- utwórz i wykonaj polecenie sqlDECLARE @sql VARCHAR(MAX) =' SELECT Category, ' + @cols + ' FROM ##tmp PIVOT ( MAX([ Wartość]) FOR dr IN (' + @cols + ') ) piv ZAMÓW WG o, PRZYPADEK Kategoria KIEDY ''Codziennie'' TO 4 KIEDY ''Tygodniowe'' TO 3 KIEDY ''MIESIĘCZNE'' TO 2 WH PL ''Bull Bear Gap'' THEN 1 ELSE 5 END, Category'EXEC(@sql)