Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Non si ottengono i valori SUM corretti in SQL Server 2012 quando si utilizza un PIVOT

La seguente query dovrebbe darti ciò che desideri:

SELECT Store,
       TotalSold,
       [John] AS WastedByJohn,
       [Jim] AS WastedByJim,
       [Alex] AS WastedByAlex
FROM (SELECT Store, Employee, Waste,
             SUM(Sold) OVER (PARTITION BY Store) AS TotalSold
      FROM #Foo) src
PIVOT
    (SUM(Waste)
     FOR Employee IN ([John], [Jim], [Alex])
    ) PVT

Per capire perché ottieni risultati inaspettati, prova la tua query senza il GROUP BY clausola:

SELECT Store, Sold, [John], [Jim], [Alex]
FROM 
    #Foo
PIVOT
    (SUM(Waste)
     FOR Employee IN ([John], [Jim], [Alex])
    ) PVT

Risultato:

Store       Sold    John    Jim     Alex
Harrisburg  20,00   20,00   10,00   NULL
Seattle     20,00   NULL    10,00   10,00

Ora, riprova lo stesso con la seconda versione dei dati di esempio:

Risultato:

Store       Sold    John    Jim     Alex
Harrisburg  25,00   10,00   NULL    NULL
Harrisburg  30,00   10,00   NULL    NULL
Harrisburg  40,00   NULL    10,00   NULL
Seattle     50,00   NULL    10,00   NULL
Seattle     60,00   NULL    NULL    10,00

Confrontando i 2 diversi set di risultati puoi vedere chiaramente quel PIVOT avviene per ogni combinazione di colonne non partecipanti, ovvero per ogni combinazione di Store , Sold .

Nel primo caso c'è solo Harrisburg,20,00 e Seattle,20,00 . Ecco perché in questo caso ottieni solo due righe. Nel secondo caso hai un totale di 3 + 2 =5 combinazioni.

Ora puoi capire perché GROUP BY funziona solo nel secondo caso.