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

Saya ingin hasil kueri pemilihan dalam format tabel seperti laporan ringkasan

Di SQL Server 2008 Anda dapat menangani tugas ini dengan cukup mudah dengan kueri PIVOT. Contoh berikut bergantung pada memasukkan data Anda ke dalam format berikut (yang sepertinya sudah Anda lakukan):

Name        Month    Value
----------  -------  -----
District 1  Month 1     10
District 1  Month 2      5
District 1  Month 3      6
District 2  Month 1      1
District 2  Month 2      2
District 2  Month 3      3
District 3  Month 1      8
District 3  Month 2      6
District 3  Month 3     11

Jika Anda dapat melakukannya, kueri PIVOT Anda akan terlihat seperti ini:

DECLARE @myTable AS TABLE([Name] VARCHAR(20), [Month] VARCHAR(20), [Value] INT)
INSERT INTO @myTable VALUES ('District 1', 'Month 1', 10)
INSERT INTO @myTable VALUES ('District 1', 'Month 2', 5)
INSERT INTO @myTable VALUES ('District 1', 'Month 3', 6)
INSERT INTO @myTable VALUES ('District 2', 'Month 1', 1)
INSERT INTO @myTable VALUES ('District 2', 'Month 2', 2)
INSERT INTO @myTable VALUES ('District 2', 'Month 3', 3)
INSERT INTO @myTable VALUES ('District 3', 'Month 1', 8)
INSERT INTO @myTable VALUES ('District 3', 'Month 2', 6)
INSERT INTO @myTable VALUES ('District 3', 'Month 3', 11)

SELECT [Name], [Month 1], [Month 2], [Month 3], [NameTotalValue] AS [Total]
FROM
(
      SELECT [Name], [Month], [Value], 
             SUM([Value]) OVER (PARTITION BY [Name]) as [NameTotalValue] 
      FROM @myTable
    UNION 
      SELECT 'Total', [Month], SUM([Value]), (SELECT SUM([Value]) FROM @myTable)
      FROM @myTable
      GROUP BY [Month]
) t
PIVOT
(
    SUM([Value]) FOR [Month] IN ([Month 1], [Month 2], [Month 3]) 
) AS pvt
ORDER BY pvt.[Name]

Dalam contoh ini, saya menggunakan SUM([Value]) OVER PARTITION untuk mendapatkan jumlah untuk setiap Distrik, dan kemudian saya melakukan UNION untuk menambahkan baris total ke bawah. Hasilnya terlihat seperti ini:

Name        Month 1 Month 2 Month 3 Total
----------- ------- ------- ------- -----
District 1       10       5       6    21
District 2        1       2       3     6
District 3        8       6      11    25
Total            19      13      20    52

Satu hal yang akan Anda perhatikan tentang pendekatan ini adalah Anda harus mengetahui nama kolom yang Anda inginkan di bagian atas tabel sebelumnya. Itu mudah dilakukan jika Anda menyiapkan laporan untuk berjalan selama setahun penuh, tetapi lebih sulit jika jumlah kolom akan berubah. Jika Anda akan mengizinkan pengguna untuk menentukan rentang tanggal khusus (yaitu, 07/2011-10/2011 atau 06/2011-11/2011), maka salah satu cara menangani persyaratan itu adalah dengan membuat kueri PIVOT menggunakan SQL dinamis lalu jalankan dengan sp_executesql .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Perbaiki Error Msg 4151 "Tipe argumen pertama ke NULLIF tidak dapat menjadi konstanta NULL karena tipe argumen pertama harus diketahui" di SQL Server

  2. Bagaimana cara mengurai VARCHAR yang diteruskan ke prosedur tersimpan di SQL Server?

  3. Cara Menjatuhkan Kolom dengan Batasan di SQL Server

  4. Bagaimana cara memilih 5 baris terakhir dalam tabel tanpa menyortir?

  5. SQL Server mengonversi kolom menjadi kolom identitas