Ich habe eine Tabelle mit Spalten sales(int)
, month(int)
. Ich möchte die Summe der Verkäufe, die jedem Monat entsprechen, abrufen. Ich muss in Form von 12 Spalten ausgeben, die jedem Monat entsprechen, in dem es einen einzelnen Datensatz geben wird, der Verkäufe für jede Spalte (Monat) enthält.SQL-Server: Zeilen in Spalten konvertieren
Antwort
Sie sollen zum Schalten Zeilen mit Spalten auf PIVOT einen Blick. Dies verhindert eine Select-Anweisung für jeden Monat. Etwas wie dieses:
DECLARE @salesTable TABLE
(
[month] INT,
sales INT
)
-- Note that I use SQL Server 2008 INSERT syntax here for inserting
-- multiple rows in one statement!
INSERT INTO @salesTable
VALUES (0, 2) ,(0, 2) ,(1, 2) ,(1, 2) ,(2, 2)
,(3, 2) ,(3, 2) ,(4, 2) ,(4, 2) ,(5, 2)
,(6, 2) ,(6, 2) ,(7, 2) ,(8, 2) ,(8, 2)
,(9, 2) ,(10, 2) ,(10, 2) ,(11, 2) ,(11, 2)
SELECT [0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11]
FROM
(
SELECT [month], sales
FROM @salesTable
) AS SourceTable
PIVOT
(
SUM(sales)
FOR [month] IN ([0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11])
) AS PivotTable
Nicht schön ... aber das funktioniert gut
SELECT
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 1) [Sales1],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 2) [Sales2],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 3) [Sales3],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 4) [Sales4],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 5) [Sales5],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 6) [Sales6],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 7) [Sales7],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 8) [Sales8],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 9) [Sales9],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 10) [Sales10],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 11) [Sales11],
(SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 12) [Sales12]
Sie können es mit OLAP tun. Here ist ein weiterer Link zur MSDN-Dokumentation zum Thema.
Mit OLAP können Sie einen Würfel mit den Informationen erstellen, die Sie haben, mit dem Layout, das Sie benötigen.
Wenn Sie nicht auf diese Weise gehen möchten, müssen Sie Übersichtstabellen mit .NET, Java, TransacSQL oder Ihrer bevorzugten Sprache erstellen, um SQLServer-Daten zu bearbeiten.
Hier ist eine alternative Möglichkeit, den Pivot zu schreiben, der Ihnen ein wenig mehr Kontrolle gibt (besonders über die Spaltennamen). Es ist auch ein wenig einfacher, dynamisches SQL zu generieren.
Es ist ähnlich wie Robin Antwort, hat aber den Vorteil, nur einmal auf den Tisch schlagen:
select
Sales1 = sum(case when Month = 1 then Sales end)
, Sales2 = sum(case when Month = 2 then Sales end)
, Sales3 = sum(case when Month = 3 then Sales end)
-- etc..
from SalesTable;
ich einige Untersuchungen tat, und es scheint, als ob der neue Pivot-Operator für diese Art der Abfrage nur Syntax Zucker . Die Abfragepläne sehen identisch aus.
Als eine interessante Seite scheint der Unpivot-Operator auch nur Syntax Sugar zu sein. Zum Beispiel:
Wenn Sie eine Tabelle wie haben:
Create Table Sales (JanSales int, FebSales int, MarchSales int...)
können Sie schreiben:
select unpivoted.monthName, unpivoted.sales
from Sales s
outer apply (
select 'Jan', JanSales union all
select 'Feb', FebSales union all
select 'March', MarchSales
) unpivoted(monthName, sales);
und die verschwenkten Daten erhalten ...
Um leicht Spalten in Zeilen transponieren mit seinen Namen sollten Sie XML verwenden. In meinem Blog habe ich dies mit Beispiel beschrieben: Link
Sie die regulären vor 2008 INSERT Syntax –
Du hast wahrscheinlich recht, obwohl die Frage nicht eine SQL Server-Version erwähnen zeigen sollen. Meine Antwort wurde aktualisiert, um den Leser über den Syntaxunterschied zu informieren. –
@sahil garg: Hast du das zur Arbeit gebracht? –