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

Får ikke de korrekte SUM-værdier i SQL Server 2012, når du bruger en PIVOT

Følgende forespørgsel skulle give dig, hvad du ønsker:

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

For at forstå hvorfor du får uventede resultater, prøv din forespørgsel uden GROUP BY klausul:

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

Output:

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

Prøv nu det samme igen med anden version af eksempeldata:

Output:

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

Ved at sammenligne de 2 forskellige resultatsæt kan du tydeligt se den PIVOT finder sted for hver kombination af kolonner, der ikke deltager i den, dvs. for hver kombination af Store , Sold .

I det første tilfælde er der kun Harrisburg,20,00 og Seattle,20,00 . Derfor får du kun to rækker i dette tilfælde. I det andet tilfælde har du i alt 3 + 2 =5 kombinationer.

Du kan nu se hvorfor GROUP BY virker kun i det andet tilfælde.



  1. Sådan får du det korte månedsnavn fra en dato i MariaDB

  2. as3, MySQL PHP-forbindelse

  3. Spring Data JPA + Hibernate Spring over låste rækker (PostgreSQL)

  4. hvordan man indstiller variabel værdi i mysql CREATE TABLE forespørgsel? Java