Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Server 2008 R2 — Dynamic Pivot/Unpivot z (przenoszeniem) dat

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)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak połączyć się z SQL Server za pomocą sqlalchemy przy użyciu uwierzytelniania systemu Windows?

  2. SQL ta sama jednostka między dwoma tabelami wymaga numerów porządkowych w 1 komórce

  3. SQL Server Standard Edition High Availability Futures

  4. SQL Server:znajdź duplikaty w tabeli na podstawie wartości w jednej kolumnie

  5. Zrozumienie różnic między CUBE a ROLLUP