Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Dynamische Spalten – SQL Server – Monate als Spalten

Ihre Daten sind bereits pivotiert, müssen aber auf einer anderen Ebene pivotiert werden. Ich denke, der beste Weg, dies zu handhaben, besteht darin, es zuerst zu deaktivieren und dann die richtige Pivot-Ebene als zweites zu behandeln.

Schritt 1:Unpivotieren

Sie können SQL 2005 UNPIVOT verwenden Befehl, oder verwenden Sie eine CROSS JOIN-Technik. Hier sind Beispiele für beides. Beachten Sie, dass ich Monate in der Mitte ausgelassen habe, um die Dinge einfach zu halten. Fügen Sie sie einfach hinzu.

-- 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)

Jede Zeile wird 12 Mal wiederholt, dann zieht eine CASE-Anweisung nur einen Monat für jede Zeile heraus, wodurch die Daten schön unpivotiert bleiben.

-- 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

Keine Methode ist immer ein klarer Leistungssieger. Manchmal funktioniert das eine besser als das andere (abhängig von den geschwenkten Daten). Die UNPIVOT-Methode verwendet einen Filter im Ausführungsplan, den CROSS JOIN nicht hat.

Schritt 2:Erneut drehen

Nun, wie man die nichtpivotierten Daten verwendet. Sie haben nicht gesagt, wie Ihr jemand ist wird dies verbrauchen, aber da Sie die Daten in eine Art Ausgabedatei packen müssen, schlage ich vor, SSRS (Sql Server Reporting Services) zu verwenden, das ohne Aufpreis mit SQL Server 2005 geliefert wird.

Verwenden Sie einfach die Matrix Berichtsobjekt, um eine der obigen Abfragen zu pivotieren. Dieses Objekt bestimmt problemlos die Datenwerte, die zur Laufzeit des Berichts in Spaltenbeschriftungen umgewandelt werden sollen, und klingt nach genau dem, was Sie brauchen. Wenn Sie eine Spalte hinzufügen, die das Datum genau nach Ihren Wünschen formatiert, können Sie nach der Mo-Spalte sortieren, aber den neuen Ausdruck als Spaltenbezeichnung verwenden.

SSRS bietet auch eine große Auswahl an Formaten und Planungsoptionen. Sie können beispielsweise eine Excel-Datei per E-Mail versenden oder eine Webseite in einer Dateifreigabe speichern.

Bitte lassen Sie mich wissen, wenn ich etwas ausgelassen habe.

Für alle, die den obigen Code in Aktion sehen möchten, hier ist ein Erstellungsskript für Sie:

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)