Frage

Ich habe eine Tabelle mit Spalten sales(int), month(int). Ich möchte Summe der Verkäufe für jeden Monat entsprechend abgerufen werden. Ich brauche ouput in Form von 12 Spalten zu jedem Monat entsprechen, in dem es ein einziger Datensatz für für jede Spalte (Monat), die Verkäufe sein.

War es hilfreich?

Lösung

Sie sollten einen Blick auf PIVOT zum Schalten Zeilen mit Spalten . Dies verhindert, dass eine select-Anweisung für jeden Monat. So etwas wie folgt aus:

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

Andere Tipps

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]

Hier ist eine alternative Möglichkeit, die Dreh zu schreiben, dass Ihnen ein wenig mehr Kontrolle (vor allem über die Spaltennamen) gibt. Es ist auch ein wenig einfacher für dynamischen SQL zu generieren.

Es ist ähnlich wie Robin Antwort, hat aber den Vorteil, dass nur die Tabelle einmal treffen:

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 habe einige Untersuchungen, und es scheint, als ob der neue Pivot-Operator nur Syntax Zucker für diese Art der Abfrage ist. Die Abfragepläne am Ende aussehen identisch.

Als interessantes beiseite, scheint die Entpivotisierung Bediener auch nur Syntax Zucker zu sein. Zum Beispiel:

Wenn Sie eine Tabelle wie:

Create Table Sales ( JanSales int, FebSales int, MarchSales int...)

Sie können 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 bekommen ...

Sie können es mit OLAP . Hier ist ein weiterer Link zu MSDN-Dokumentation zum Thema .

Mit OLAP können Sie einen Würfel mit den Informationen erstellen Sie haben, mit dem Layout, das Sie benötigen.

Wenn Sie wollen, dass die Art und Weise nicht gehen, werden Sie erstellen müssen, um Übersichtstabellen mit .NET, Java, TransacSQL oder Ihrer bevorzugten Sprache zu SQLServer Daten zu manipulieren.

leicht zu Spalten in Zeilen mit Namen umsetzen sollten Sie XML verwenden. In meinem Blog habe ich dies mit Beispiel beschrieben: Link-

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top