Mencari solusi elegan (atau apa saja) untuk mengonversi kolom menjadi baris.
Berikut ini sebuah contoh: Saya punya tabel dengan skema berikut:
[ID] [EntityID] [Indicator1] [Indicator2] [Indicator3] ... [Indicator150]
Inilah yang ingin saya dapatkan sebagai hasilnya:
[ID] [EntityId] [IndicatorName] [IndicatorValue]
Dan nilai hasilnya adalah:
1 1 'Indicator1' 'Value of Indicator 1 for entity 1'
2 1 'Indicator2' 'Value of Indicator 2 for entity 1'
3 1 'Indicator3' 'Value of Indicator 3 for entity 1'
4 2 'Indicator1' 'Value of Indicator 1 for entity 2'
Dan seterusnya..
Apakah ini masuk akal? Apakah Anda memiliki saran tentang ke mana harus mencari dan bagaimana menyelesaikannya dalam T-SQL?
sql
sql-server
tsql
unpivot
Sergei
sumber
sumber
Jawaban:
Anda dapat menggunakan fungsi UNPIVOT untuk mengubah kolom menjadi baris:
Catatan, tipe data dari kolom yang Anda tidakivot harus sama sehingga Anda mungkin harus mengonversi tipe data sebelum menerapkan unpivot.
Anda juga dapat menggunakan
CROSS APPLY
dengan UNION ALL untuk mengonversi kolom:Bergantung pada versi SQL Server Anda, Anda bahkan bisa menggunakan CROSS APPLY dengan klausa VALUES:
Terakhir, jika Anda memiliki 150 kolom untuk tidak diproteksi dan Anda tidak ingin meng-hard-code seluruh kueri, maka Anda bisa membuat pernyataan sql menggunakan SQL dinamis:
sumber
UNPIVOT
dan / vs.APPLY
, posting blog 2010 ini dari Brad Schulz (dan tindak lanjutnya ) indah.baik Jika Anda memiliki 150 kolom maka saya pikir UNPIVOT bukanlah suatu pilihan. Jadi Anda bisa menggunakan trik xml
sql fiddle demo
Anda juga bisa menulis SQL dinamis, tetapi saya lebih suka xml - untuk SQL dinamis Anda harus memiliki izin untuk memilih data langsung dari tabel dan itu tidak selalu menjadi pilihan.
MEMPERBARUI
Karena ada nyala besar dalam komentar, saya pikir saya akan menambahkan beberapa pro dan kontra dari xml / SQL dinamis. Saya akan berusaha seobjektif mungkin dan tidak menyebutkan keanggunan dan keburukan. Jika Anda mendapatkan pro dan kontra lainnya, edit jawabannya atau tulis komentar
kontra
pro
inserted
dandeleted
tabel di dalam pemicu Anda (tidak mungkin dengan dinamis sama sekali);sumber
Hanya untuk membantu pembaca baru, saya telah membuat contoh untuk lebih memahami jawaban @ bluefeet tentang UNPIVOT.
sumber
Saya membutuhkan solusi untuk mengonversi kolom ke baris di Microsoft SQL Server, tanpa mengetahui nama colum (digunakan dalam trigger) dan tanpa sql dinamis (sql dinamis terlalu lambat untuk digunakan dalam trigger).
Saya akhirnya menemukan solusi ini, yang berfungsi dengan baik:
Seperti yang Anda lihat, saya mengubah baris menjadi XML (Subquery select i, * untuk xml raw, ini mengubah semua kolom menjadi satu kolom xml)
Kemudian saya SALINKAN fungsi untuk setiap atribut XML kolom ini, sehingga saya mendapatkan satu baris per atribut.
Secara keseluruhan, ini mengubah kolom menjadi baris, tanpa mengetahui nama kolom dan tanpa menggunakan sql dinamis. Cukup cepat untuk tujuan saya.
(Sunting: Saya baru saja melihat Roman Pekar menjawab di atas, yang melakukan hal yang sama. Saya menggunakan pemicu sql dinamis dengan kursor pertama, yang 10 hingga 100 kali lebih lambat dari solusi ini, tapi mungkin itu disebabkan oleh kursor, bukan oleh sql dinamis. Pokoknya, solusi ini sangat sederhana dan universal, jadi ini merupakan pilihan).
Saya meninggalkan komentar ini di tempat ini, karena saya ingin merujuk penjelasan ini di posting saya tentang pemicu audit penuh, yang dapat Anda temukan di sini: https://stackoverflow.com/a/43800286/4160788
sumber
Anda bisa mendapatkan daftar tabel yang memiliki jumlah baris> 350. Anda dapat melihat pada daftar solusi tabel sebagai baris.
sumber
Hanya karena saya tidak melihatnya disebutkan.
Jika 2016+, berikut ini adalah opsi lain untuk secara dinamis tidak memproteksi data tanpa benar-benar menggunakan Dynamic SQL.
Contoh
Kembali
sumber