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:
-
Karena pengelompokan tersirat dalam kueri PIVOT, klausa GROUP BY dihapus. Sebagai gantinya, klausa PIVOT diperkenalkan.
-
Count
ekspresi kolom dipindahkan dari klausa SELECT ke klausa PIVOT. -
Pemisahan
Priority
kolom didefinisikan dalam klausa PIVOT. -
Priority
danCount
kolom dalam klausa SELECT diganti dengan daftar kolom yang didefinisikan dalam klausa PIVOT. -
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.