Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Не се получават правилните стойности на SUM в SQL Server 2012 при използване на PIVOT

Следната заявка трябва да ви даде това, което искате:

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

За да разберете защо получавате неочаквани резултати, опитайте заявката си без GROUP BY клауза:

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

Изход:

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

Сега опитайте същото отново с втората версия на примерни данни:

Изход:

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

Чрез сравняване на 2 различни набора от резултати можете ясно да видите този PIVOT се извършва за всяка комбинация от колони, които не участват в нея, т.е. за всяка комбинация от Store , Sold .

В първия случай има само Harrisburg,20,00 и Seattle,20,00 . Ето защо в този случай получавате само два реда. Във втория случай имате общо 3 + 2 =5 комбинации.

Вече можете да видите защо GROUP BY работи само във втория случай.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Изберете стойност при условие в SQL Server

  2. SQL филтър за добавяне само ако променливата не е нулева

  3. PowerShell - Списък на всички SQL екземпляри в моята система?

  4. Как SQLParameter предотвратява SQL инжекцията?

  5. Регулярни изрази в сървърите на SQL Server?