Domanda

Ho una tabella con le colonne sales (int) , month (int) . Voglio recuperare la somma delle vendite corrispondenti a ogni mese. Ho bisogno dell'output in forma di 12 colonne corrispondenti a ogni mese in cui ci sarà un singolo record contenente le vendite per ogni colonna (mese).

È stato utile?

Soluzione

Dovresti dare un'occhiata a PIVOT per cambiare le righe con le colonne . Questo impedisce un'istruzione select per ogni mese. Qualcosa del genere:

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

Altri suggerimenti

Non carino ... ma funziona bene

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]

Ecco un modo alternativo per scrivere il pivot che ti dà un po 'più di controllo (specialmente sui nomi delle colonne). È anche un po 'più semplice generare SQL dinamico per.

È simile alla risposta di Robin, ma ha il vantaggio di colpire il tavolo solo una volta:

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;

Ho fatto qualche indagine e sembra che il nuovo operatore pivot sia solo zucchero di sintassi per questo tipo di query. I piani di query sembrano identici.

Come interessante a parte, l'operatore unpivot sembra anche essere solo zucchero di sintassi. Ad esempio:

Se hai una tabella come:

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

Puoi scrivere:

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

E ottieni i dati non sponsorizzati ...

Puoi farlo con OLAP . Qui c'è un altro link alla documentazione MSDN sull'argomento .

Con OLAP, puoi creare un cubo con le informazioni che hai, con il layout di cui hai bisogno.

Se non si desidera procedere in questo modo, sarà necessario creare tabelle di riepilogo con .NET, Java, TransacSQL o la propria lingua preferita per manipolare i dati di SQL Server.

Per trasporre facilmente le colonne in righe con i suoi nomi devi usare XML. Nel mio blog sono stato descritto con questo esempio: Link

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top