Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Ne pas obtenir les valeurs SUM correctes dans SQL Server 2012 lors de l'utilisation d'un PIVOT

La requête suivante devrait vous donner ce que vous voulez :

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

Pour comprendre pourquoi vous obtenez des résultats inattendus, essayez votre requête sans le GROUP BY clause :

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

Sortie :

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

Maintenant, réessayez la même chose avec la deuxième version des exemples de données :

Sortie :

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

En comparant les 2 ensembles de résultats différents, vous pouvez clairement voir que PIVOT a lieu pour chaque combinaison de colonnes qui n'y participent pas, c'est-à-dire pour chaque combinaison de Store , Sold .

Dans le premier cas, il n'y a que Harrisburg,20,00 et Seattle,20,00 . C'est pourquoi vous n'obtenez que deux lignes dans ce cas. Dans le second cas, vous avez un total de 3 + 2 =5 combinaisons.

Vous pouvez maintenant comprendre pourquoi GROUP BY ne fonctionne que dans le second cas.