Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Nie uzyskiwanie poprawnych wartości SUMA w programie SQL Server 2012 podczas korzystania z PIVOT

Poniższe zapytanie powinno dać ci to, czego chcesz:

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

Aby zrozumieć, dlaczego otrzymujesz nieoczekiwane wyniki, wypróbuj zapytanie bez GROUP BY klauzula:

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

Wyjście:

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

Teraz spróbuj to samo ponownie z drugą wersją przykładowych danych:

Wyjście:

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

Porównując 2 różne zestawy wyników, możesz wyraźnie zobaczyć, że PIVOT ma miejsce dla każdej kombinacji kolumn, które w niej nie uczestniczą, tj. dla każdej kombinacji Store , Sold .

W pierwszym przypadku jest tylko Harrisburg,20,00 i Seattle,20,00 . Dlatego w tym przypadku otrzymujesz tylko dwa rzędy. W drugim przypadku masz w sumie 3 + 2 =5 kombinacji.

Teraz możesz zobaczyć, dlaczego GROUP BY działa tylko w drugim przypadku.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przekonwertować „01 września 2017” na „01/09/2017” w T-SQL?

  2. Błąd konwersji danych zbiorczego ładowania (niezgodność typu lub nieprawidłowy znak dla określonej strony kodowej) dla wiersza 1, kolumny 4 (rok)

  3. Wartości dziesiętne w SQL do dzielenia wyników

  4. SQL Server 2008, ile to zajmuje miejsca?

  5. OdbcCommand w procedurze składowanej — błąd braku podania parametru w parametrze wyjściowym