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

Kueri SQL Server:baris membuat kolom (Pivot?)

Pivoting sangat mirip dengan pengelompokan. Anda dapat melihatnya sebagai pengelompokan terbatas dengan 'efek khusus'. Batasannya terdiri dari kenyataan bahwa hanya ada satu kolom agregat. (Dalam kueri GROUP BY normal, Anda dapat memiliki lebih dari satu, tentu saja.) Dan dengan 'efek khusus' yang saya maksud, tentu saja, salah satu kolom lain (dan, sekali lagi, hanya satu) diubah menjadi beberapa kolom.

Mari kita ambil kueri GROUP BY Anda sebagai contoh. Anda punya tiga kolom di output. Salah satunya, Count , adalah kolom yang berisi informasi agregat. Itu adalah salah satu yang akan tersebar di antara beberapa kolom dalam kueri PIVOT. Kolom lain, Priority , adalah salah satu dari dua kolom lain yang hasilnya dikelompokkan dan juga kolom yang perlu diputar. Terakhir, EntryDate adalah kolom GROUP BY lainnya. Seharusnya tetap seperti itu, karena tidak secara langsung mengambil bagian dalam berputar.

Mari kita lihat sekarang bagaimana SELECT utama Anda diubah dari kueri GROUP BY biasa menjadi kueri PIVOT, langkah demi langkah:

  1. Karena pengelompokan tersirat dalam kueri PIVOT, klausa GROUP BY dihapus. Sebagai gantinya, klausa PIVOT diperkenalkan.

  2. Count ekspresi kolom dipindahkan dari klausa SELECT ke klausa PIVOT.

  3. Pemisahan Priority kolom didefinisikan dalam klausa PIVOT.

  4. Priority dan Count kolom dalam klausa SELECT diganti dengan daftar kolom yang didefinisikan dalam klausa PIVOT.

  5. EntryDate kolom tetap tidak berubah dalam klausa SELECT.

Dan inilah kueri yang dihasilkan, dengan komentar yang menandai setiap bagian dari transformasi yang dijelaskan di atas:

WITH TATH(Priority, EntryDate) AS 
(
    SELECT TH.Priority as Priority, DATEADD(dd, 0, DATEDIFF(dd, 0, entryDate)) as EntryDate
      FROM TicketAssignment TA, TicketHeader TH 
     WHERE TA.TicketID = TH.TicketID   
       AND TA.Company = 'IT'
       AND TA.CurrentRole IN ('SA1B','SA1C','SDA')
) 
SELECT
  convert(varchar(10), EntryDate,103) as EntryDate,                       -- #5
  [0] AS Priority0, [1] AS Priority1, [2] AS Priority2, [3] AS Priority3  -- #4
FROM TATH
PIVOT (                                                                   -- #1
  COUNT(*)                                                                -- #2
  FOR Priority IN ([0], [1], [2], [3])                                    -- #3
) p

/*  -- your original main query, for comparison
SELECT
  Priority,                                                               -- #4
  convert(varchar(10),                                                    -- #5
  EntryDate,103) as EntryDate, COUNT(*) AS Count                          -- ##2&4
FROM TATH 
GROUP BY Priority, EntryDate                                              -- #1
*/

Ada satu catatan tambahan pada daftar kolom dalam klausa PIVOT. Pertama-tama, Anda harus memahami bahwa kumpulan kueri SQL yang dihasilkan seharusnya diperbaiki dalam hal jumlah kolom dan namanya. Itu berarti Anda harus secara eksplisit menghitung semua kolom yang diubah yang ingin Anda lihat di output. Nama berasal dari nilai kolom yang diputar tetapi harus ditentukan sebagai nama , bukan sebagai nilai. Itulah mengapa Anda dapat melihat tanda kurung siku di sekitar nomor yang tercantum. Karena angka itu sendiri tidak memenuhi aturan untuk pengidentifikasi biasa , mereka harus dibatasi.

Anda juga dapat melihat bahwa Anda dapat alias kolom yang diputar dalam klausa SELECT sama seperti kolom atau ekspresi lainnya. Jadi, pada akhirnya, Anda tidak harus berakhir dengan 0 . yang tidak berarti , 1 dll. pengenal dan sebagai gantinya Anda dapat menetapkan kolom tersebut dengan nama apa pun yang Anda suka.

Jika Anda ingin nomor dan/atau nama kolom berporos menjadi dinamis, Anda harus membuat kueri secara dinamis, yaitu mengumpulkan nama terlebih dahulu, lalu memasukkannya ke dalam string yang berisi sisa kueri dan panggil kueri terakhir dengan EXEC () atau EXEC sp_executesql . Anda dapat menelusuri situs ini untuk informasi lebih lanjut tentang pivot dinamis.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konversi tipe data datetime2 ke tipe data datetime kecil menghasilkan nilai di luar rentang.\r\nPernyataan telah dihentikan

  2. 6 Pertanyaan Masalah yang Memperlambat Basis Data Anda

  3. Ubah waktu desimal menjadi jam dan menit

  4. 3 Cara Mengembalikan Semua Tabel TANPA Kunci Utama di SQL Server

  5. Bagaimana cara menyimpan dan mengambil gambar dalam database sql server melalui VB.NET