Dimulai dengan SQL Server 2017, Anda sekarang dapat membuat hasil kueri Anda muncul sebagai daftar. Ini berarti Anda dapat membuat kumpulan hasil Anda muncul sebagai daftar yang dipisahkan koma, daftar yang dipisahkan spasi, atau pemisah apa pun yang Anda pilih untuk digunakan.
Meskipun benar bahwa Anda dapat mencapai efek yang sama sebelum SQL Server 2017, itu sedikit rumit.
Transact-SQL sekarang memiliki STRING_AGG()
fungsi, yang menggabungkan nilai-nilai ekspresi string dan menempatkan nilai pemisah di antara mereka. Ini bekerja dengan cara yang hampir sama dengan GROUP_CONCAT()
MySQL fungsi.
Artikel ini memberikan contoh yang mendemonstrasikan STRING_AGG()
T T-SQL fungsi.
Contoh Data
Pertama, ini beberapa contoh datanya.
SELECT TaskId, TaskName FROM Tasks;
Hasil:
TaskId TaskName ------ ------------ 1 Feed cats 2 Water dog 3 Feed garden 4 Paint carpet 5 Clean roof 6 Feed cats
Contoh – Daftar Dipisahkan Koma
Jadi kita bisa mengambil data di atas, dan menggunakan STRING_AGG()
berfungsi untuk membuat daftar semua nama tugas dalam satu daftar besar yang dipisahkan koma.
Seperti ini:
SELECT STRING_AGG(TaskName, ', ') FROM Tasks;
Hasil:
Feed cats, Water dog, Feed garden, Paint carpet, Clean roof, Feed cats
Tentu saja, tidak perlu dipisahkan dengan koma. Itu dapat dipisahkan dengan ekspresi apa pun dari NVARCHAR
atau VARCHAR
ketik, dan bisa berupa literal atau variabel.
Contoh – Menggabungkan Kolom
Kita juga bisa menggunakan CONCAT()
berfungsi untuk menggabungkan dua bidang bersama-sama, dipisahkan oleh pemisahnya sendiri.
Contoh:
SELECT STRING_AGG(CONCAT(TaskId, ') ', TaskName), ' ') FROM Tasks;
Hasil:
1) Feed cats 2) Water dog 3) Feed garden 4) Paint carpet 5) Clean roof 6) Feed cats
Contoh – Nilai Null
Jika kumpulan hasil Anda berisi nilai nol, nilai tersebut akan diabaikan dan pemisah yang sesuai tidak ditambahkan.
Jika ini tidak sesuai, Anda dapat memberikan nilai untuk nilai null dengan menggunakan ISNULL()
fungsi dan meneruskan nilai yang ingin Anda gunakan setiap kali nilai nol ditemukan. Melakukan hal ini memastikan bahwa Anda masih mendapatkan hasil saat baris berisi nilai nol.
Misalnya, pertimbangkan kueri dan kumpulan hasil berikut:
SELECT TaskCode FROM Tasks;
Hasil:
TaskCode -------- cat123 null null pnt456 rof789 null
Kita dapat melihat bahwa ada tiga nilai nol dalam kumpulan hasil.
Jika kita menjalankan ini melalui STRING_AGG()
fungsi, kita mendapatkan ini:
SELECT STRING_AGG(TaskCode, ', ') FROM Tasks;
Hasil:
cat123, pnt456, rof789
Namun, jika kita menggunakan ISNULL()
fungsi untuk menyediakan placeholder untuk nilai nol apa pun, kami mendapatkan ini:
SELECT STRING_AGG(ISNULL(TaskCode, 'N/A'), ', ') FROM Tasks;
Hasil:
cat123, N/A, N/A, pnt456, rof789, N/A
Contoh – Hasil yang Dikelompokkan
Anda juga dapat menggunakan STRING_AGG()
berfungsi saat mengelompokkan set hasil Anda. Misalnya, Anda mungkin ingin daftar album yang dikelompokkan menurut artis.
Untuk mendemonstrasikan ini, bayangkan sebuah database dengan dua tabel; Artists
dan Albums
. Ada hubungan satu ke banyak antara tabel-tabel ini. Untuk setiap artis, mungkin ada banyak album.
Jadi kueri biasa yang menggabungkan kedua tabel mungkin terlihat seperti ini:
USE Music; SELECT ar.ArtistName, al.AlbumName FROM Artists ar INNER JOIN Albums al ON ar.ArtistId = al.ArtistId;
Hasil:
ArtistName AlbumName ------------------------- ------------------------ Iron Maiden Powerslave AC/DC Powerage Jim Reeves Singing Down the Lane Devin Townsend Ziltoid the Omniscient Devin Townsend Casualties of Cool Devin Townsend Epicloud Iron Maiden Somewhere in Time Iron Maiden Piece of Mind Iron Maiden Killers Iron Maiden No Prayer for the Dying The Script No Sound Without Silence Buddy Rich Big Swing Face Michael Learns to Rock Blue Night Michael Learns to Rock Eternity Michael Learns to Rock Scandinavia Tom Jones Long Lost Suitcase Tom Jones Praise and Blame Tom Jones Along Came Jones Allan Holdsworth All Night Wrong Allan Holdsworth The Sixteen Men of Tain
Seperti yang Anda lihat, jika seorang artis memiliki lebih dari satu album, nama artis tersebut akan dicantumkan beberapa kali – satu kali untuk setiap album.
Tapi kita bisa menggunakan STRING_AGG()
untuk mengubahnya sehingga kami mencantumkan setiap artis hanya sekali, diikuti dengan daftar album yang dipisahkan koma yang mereka rilis:
USE Music; SELECT ar.ArtistName, STRING_AGG(al.AlbumName, ', ') FROM Artists ar INNER JOIN Albums al ON ar.ArtistId = al.ArtistId GROUP BY ArtistName;
Hasil:
ArtistName ------------------------- ------------------------------------------------------------------------------ AC/DC Powerage Allan Holdsworth All Night Wrong, The Sixteen Men of Tain Buddy Rich Big Swing Face Devin Townsend Ziltoid the Omniscient, Casualties of Cool, Epicloud Iron Maiden Powerslave, Somewhere in Time, Piece of Mind, Killers, No Prayer for the Dying Jim Reeves Singing Down the Lane Michael Learns to Rock Blue Night, Eternity, Scandinavia The Script No Sound Without Silence Tom Jones Long Lost Suitcase, Praise and Blame, Along Came Jones
Contoh – Mengurutkan Hasil
Anda dapat menggunakan klausa pesanan untuk mengurutkan hasil dalam grup gabungan. Ini dilakukan dengan WITHIN GROUP
ayat. Saat menggunakan klausa ini, Anda menentukan urutan dengan ORDER BY
diikuti oleh ASC
(untuk menaik) atau DESC
(untuk turun).
Contoh:
USE Music; SELECT ar.ArtistName, STRING_AGG(al.AlbumName, ', ') WITHIN GROUP (ORDER BY al.AlbumName DESC) FROM Artists ar INNER JOIN Albums al ON ar.ArtistId = al.ArtistId GROUP BY ArtistName;
Hasil:
ArtistName ------------------------- ------------------------------------------------------------------------------ AC/DC Powerage Allan Holdsworth The Sixteen Men of Tain, All Night Wrong Buddy Rich Big Swing Face Devin Townsend Ziltoid the Omniscient, Epicloud, Casualties of Cool Iron Maiden Somewhere in Time, Powerslave, Piece of Mind, No Prayer for the Dying, Killers Jim Reeves Singing Down the Lane Michael Learns to Rock Scandinavia, Eternity, Blue Night The Script No Sound Without Silence Tom Jones Praise and Blame, Long Lost Suitcase, Along Came Jones