Saya punya beberapa customer_comments
pembagian menjadi beberapa baris karena desain basis data, dan untuk laporan saya perlu menggabungkan comments
masing-masing id
baris menjadi satu baris. Saya sebelumnya mencoba sesuatu yang bekerja dengan daftar terbatas ini dari klausa SELECT dan trik COALESCE tapi saya tidak dapat mengingatnya dan tidak boleh menyimpannya. Sepertinya saya tidak bisa membuatnya berfungsi dalam kasus ini, hanya tampaknya bekerja pada satu baris.
Data terlihat seperti ini:
id row_num customer_code comments
-----------------------------------
1 1 Dilbert Hard
1 2 Dilbert Worker
2 1 Wally Lazy
Hasil saya harus terlihat seperti ini:
id customer_code comments
------------------------------
1 Dilbert Hard Worker
2 Wally Lazy
Jadi untuk masing-masing row_num
hanya ada satu baris hasil; komentar harus dikombinasikan dalam urutanrow_num
. SELECT
Trik yang ditautkan di atas berfungsi untuk mendapatkan semua nilai untuk kueri tertentu sebagai satu baris, tapi saya tidak tahu cara membuatnya berfungsi sebagai bagian dari SELECT
pernyataan yang memuntahkan semua baris ini.
Permintaan saya harus melalui seluruh tabel sendiri dan menampilkan baris ini. Saya tidak menggabungkannya menjadi beberapa kolom, satu untuk setiap baris, jadi PIVOT
sepertinya tidak berlaku.
sumber
order by
dalam permintaan sub. Ini adalah membangun XML menggunakanfor xml
dan itu adalah yang cara untuk membangun XML menggunakan TSQL. Urutan elemen dalam file XML adalah hal yang penting dan dapat diandalkan. Jadi jika teknik ini tidak menjamin pesanan maka dukungan XML di TSQL rusak parah.row_num desc
harus mematuhiorder by
seperti yang disarankan Mikael). Saya akan menghapus komentar yang menyarankan sebaliknya sekarang bahwa kueri berisi hakorder by
dan berharap bahwa @JonSeigel menganggap melakukan hal yang sama.Jika Anda diizinkan menggunakan CLR di lingkungan Anda, ini adalah kasus yang dibuat khusus untuk agregat yang ditentukan pengguna.
Secara khusus, ini mungkin cara untuk pergi jika sumber data non-sepele besar dan / atau Anda perlu melakukan hal semacam ini banyak dalam aplikasi Anda. Saya sangat curiga rencana permintaan untuk solusi Aaron tidak akan menskala dengan baik karena ukuran input bertambah. (Saya mencoba menambahkan indeks ke tabel temp, tetapi itu tidak membantu.)
Solusi ini, seperti banyak hal lainnya, merupakan kompromi:
EDIT: Ya, saya pergi untuk mencoba melihat apakah ini sebenarnya lebih baik, dan ternyata persyaratan bahwa komentar dalam urutan tertentu saat ini tidak mungkin dipenuhi dengan menggunakan fungsi agregat. :(
Lihat SqlUserDefinedAggregateAttribute.IsInvariantToOrder . Pada dasarnya, apa yang perlu Anda lakukan adalah
OVER(PARTITION BY customer_code ORDER BY row_num)
tetapiORDER BY
tidak didukung dalamOVER
klausa ketika menjumlahkan. Saya berasumsi menambahkan fungsi ini ke SQL Server membuka sekaleng cacing, karena apa yang perlu diubah dalam rencana eksekusi itu sepele. Tautan yang disebutkan di atas mengatakan ini dicadangkan untuk penggunaan di masa mendatang, jadi ini dapat diterapkan di masa mendatang (pada 2005 Anda mungkin kurang beruntung).Ini bisa masih bisa dicapai dengan kemasan dan parsing
row_num
nilai ke string dikumpulkan, dan kemudian melakukan semacam dalam objek CLR ... yang tampaknya cukup hackish.Dalam hal apa pun, di bawah ini adalah kode yang saya gunakan seandainya ada orang lain yang menganggap ini berguna walaupun dengan batasan. Saya akan meninggalkan bagian peretasan sebagai latihan untuk pembaca. Perhatikan bahwa saya menggunakan AdventureWorks (2005) untuk data uji.
Perakitan agregat:
T-SQL untuk pengujian (
CREATE ASSEMBLY
, dansp_configure
untuk mengaktifkan CLR dihilangkan):sumber
Inilah solusi berbasis kursor yang menjamin urutan komentar oleh
row_num
. (Lihat jawaban saya yang lain untuk bagaimana[dbo].[Comments]
tabel itu diisi.)sumber
sumber