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

Dynamiczne kolumny — SQL Server — miesiące jako kolumny

Twoje dane są już przestawiane, ale muszą zostać przestawione na innym poziomie. Myślę, że najlepszym sposobem na poradzenie sobie z tym jest najpierw unpivot, a następnie obsługa właściwego poziomu osi.

Krok 1:Unpivot

Możesz użyć SQL 2005 UNPIVOT polecenia CROSS JOIN lub użyj techniki CROSS JOIN. Oto przykłady obu. Zauważ, że pominąłem miesiące w środku, aby wszystko było proste. Po prostu dodaj je.

-- CROSS JOIN method (also works in SQL 2000)
SELECT
   P.Project,
   Mo =
      DateAdd(mm,
         X.MonthNum,
         DateAdd(yy, P.[Year] - 1900, '19000101')
      ),
   Amount = 
      CASE X.MonthNum
         WHEN 0 THEN Jan
         WHEN 1 THEN Feb
         WHEN 11 THEN Dec
      END
FROM
   ProjectData P
   CROSS JOIN (
      SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 11
   ) X (MonthNum)

Każdy wiersz jest powtarzany 12 razy, a następnie instrukcja CASE wyciąga tylko jeden miesiąc dla każdego wiersza, pozostawiając dane niezmienione.

-- UNPIVOT method
SELECT
    P.Project,
    Mo =
       DateAdd(mm,
          Convert(int, P.MonthNum),
          DateAdd(yy, P.[Year] - 1900, '19000101')
       ),
    P.Amount
FROM
   (
      SELECT Project, [Year], [0] = Jan, [1] = Feb, [11] = Dec
      FROM ProjectData
   ) X UNPIVOT (Amount FOR MonthNum IN ([0], [1], [11])) P

DROP TABLE ProjectData

Żadna z metod nie jest przez cały czas wyraźnym zwycięzcą wydajności. Czasami jeden działa lepiej niż drugi (w zależności od danych podlegających przestawieniu). Metoda UNPIVOT używa filtra w planie wykonania, którego nie używa CROSS JOIN.

Krok 2:Przestaw ponownie

Teraz, jak korzystać z danych nieprzestawnych. Nie powiedziałeś, jak ktoś będzie to zużywać, ale ponieważ będziesz musiał umieścić dane w jakimś pliku wyjściowym, proponuję skorzystać z usług SSRS (Sql Server Reporting Services), które są dostarczane z SQL Server 2005 bez dodatkowych opłat.

Wystarczy użyć macierzy Zgłoś obiekt, aby przestawić jedno z powyższych zapytań. Ten obiekt szczęśliwie określa wartości danych, które mają zostać przekształcone w etykiety kolumn w czasie wykonywania raportu i brzmi dokładnie tak, jak potrzebujesz. Jeśli dodasz kolumnę, która formatuje datę dokładnie tak, jak chcesz, możesz uporządkować według kolumny Mo, ale użyj nowego wyrażenia jako etykiety kolumny.

SSRS oferuje również szeroką gamę dostępnych formatów i opcji planowania. Na przykład możesz wysłać e-mailem plik Excela lub zapisać stronę internetową w udziale plików.

Daj mi znać, jeśli coś pominąłem.

Dla każdego, kto chciałby zobaczyć powyższy kod w akcji, oto kilka skryptów dla Ciebie:

USE tempdb

CREATE TABLE ProjectData (
    Project varchar(10),
    [Year] int,
    Jan decimal(15, 2),
    Feb decimal(15, 2),
    Dec decimal(15, 2)
)

SET NOCOUNT ON

INSERT ProjectData VALUES ('11-11079', 2008, 0.0, 0.0, 75244.90)
INSERT ProjectData VALUES ('11-11079', 2009, 466.0, 0.0, 0.0)
INSERT ProjectData VALUES ('11-11079', 2010, 855.0, 0.0, 0.0)
INSERT ProjectData VALUES ('01-11052', 2009, 56131.0, 0.0, 0.0)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jakie jest domyślne hasło dla SQL Server 2012, jeśli nie umieściłem hasła w konfiguracji?

  2. Jak zaimportować arkusz kalkulacyjny programu Excel do programu SQL Server?

  3. Wstaw dane do tabeli SQL... nie można znaleźć danych

  4. Wykonaj regex (zamień) w zapytaniu SQL

  5. Przegląd instrukcji PRINT w SQL Server