Cara mengubah kolom menjadi baris di sql server

Silakan pertimbangkan tabel ini:

ID         Page          Line           C01          C02          C03        
---------------------------------------------------------------------
1          122            11             1            0            1
1          123            11             1            1            1
1          124            12             0            0            0
1          125            16             1            0            1
1          127            11             0            1            0

Saya ingin mengonversi tabel ini menjadi tabel ini:

ID         Page          Line           City         Value
-----------------------------------------------------------
1          122            11            C01            1           
1          122            11            C02            0  
1          122            11            C03            1  
1          123            11            C01            1  
1          123            11            C02            1  
1          123            11            C03            1  
...

Bagaimana saya bisa melakukan ini dengan cara yang tepat?


person Arian    schedule 04.07.2012    source sumber


Jawaban (5)


Gunakan UNPIVOT. Cobalah sesuatu seperti:

SELECT ID, Page, Line, City, Value
FROM SourceTable
UNPIVOT
   (Value FOR City IN 
      (C01, C02, C03)
)AS unpvt;

Dimana 'SourceTable' adalah nama tabel sumber Anda. (Catatan: Saya tidak bisa mengujinya saat ini, jadi mungkin ini kurang tepat.)

Detail selengkapnya di sini: http://msdn.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

person Bennor McCarthy    schedule 04.07.2012

Kueri di bawah ini harus memenuhi kebutuhan Anda.

SELECT ID, PAGE, LINE, "C01", C01 FROM TABLE
UNION 
SELECT ID, PAGE, LINE, "C02", C02 FROM TABLE
UNION
SELECT ID, PAGE, LINE, "C03", C03 FROM TABLE
person Senthil    schedule 04.07.2012
comment
Saya kira idenya harus jelas secara umum, tetapi: 1) Dalam Transact-SQL, tanda kutip ganda digunakan untuk membatasi nama (secara default). Untuk membatasi konstanta string, tanda petik tunggal digunakan. 2) UNION menghapus baris duplikat. Bahkan jika duplikat tidak mungkin terjadi (seperti dalam kasus ini), rencana kueri mungkin masih menyertakan langkah-langkah untuk menghapusnya, yang kemungkinan besar akan berdampak pada kinerja. Gunakan UNION ALL sebagai gantinya. 3) Alias ​​mungkin harus disediakan untuk dua kolom terakhir. - person Andriy M; 04.07.2012
comment
Terima kasih Andriy atas klarifikasinya. Menghargai itu. - person Senthil; 04.07.2012


Anda dapat mencapai ini dengan melakukan sesuatu seperti ini di Linq to sql

Apakah fungsionalitas Unpivot (Bukan Pivot) tersedia di Linq ke SQL? Bagaimana?

person Pravin Pawar    schedule 04.07.2012

Lakukan self-join, satu kali untuk setiap kolom ke-1+N. Dan buatlah tabel kartesius.

Self-join adalah menggabungkan tabel yang sama dengan tabel itu sendiri. Cocokkan berdasarkan id, halaman, dan baris.

person Ondra Žižka    schedule 04.07.2012