Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Tidak mendapatkan nilai SUM yang benar di SQL Server 2012 saat menggunakan PIVOT

Kueri berikut akan memberikan apa yang Anda inginkan:

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

Untuk memahami mengapa Anda mendapatkan hasil yang tidak diharapkan, coba kueri Anda tanpa GROUP BY klausa:

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

Keluaran:

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

Sekarang, coba hal yang sama lagi dengan data sampel versi kedua:

Keluaran:

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

Dengan membandingkan 2 kumpulan hasil yang berbeda, Anda dapat melihat dengan jelas bahwa PIVOT terjadi untuk setiap kombinasi kolom yang tidak berpartisipasi di dalamnya, yaitu untuk setiap kombinasi Store , Sold .

Dalam kasus pertama hanya ada Harrisburg,20,00 dan Seattle,20,00 . Itu sebabnya Anda hanya mendapatkan dua baris dalam kasus ini. Dalam kasus kedua, Anda memiliki total 3 + 2 =5 kombinasi.

Sekarang Anda dapat melihat mengapa GROUP BY hanya berfungsi dalam kasus kedua.



  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, Memilih antara tanggal/waktu

  2. Menggunakan Pencarian Teks Lengkap untuk menemukan sebagian kata (SQL Server 2008)

  3. Hapus ASCII Extended Characters 128 dan seterusnya (SQL)

  4. Apakah mungkin untuk memilih data server sql menggunakan posisi ordinal kolom

  5. SQL Server ROWLOCK melalui SELECT jika tidak ada transaksi INSERT