Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Pivot dengan kolom dinamis di SQL Server

Menambahkan kolom tersebut sangat sederhana. Permintaan terakhir adalah

SELECT Account, AccountName, [Feb-11],[Jan-11],[Mar-11]   FROM   
(SELECT
t1.Col_Name,
t2.Account,
t2.AccountName,
t2.Amount
FROM Table1 AS t1
JOIN Table2 AS t2 ON t1.Col_ID1 = t2.Col_ID2
) p
PIVOT
(
Sum ([Amount] )
FOR Col_Name IN
( [Feb-11],[Jan-11],[Mar-11] )
) AS pvt 

yang memiliki t2.AccountName ditambahkan ke subquery, dan Account dan AccountName ditambahkan ke SELECT awal. Masukkan mereka ke dalam pernyataan build dan Anda selesai:

DECLARE @query NVARCHAR(4000)
SET @query = N'SELECT Account, AccountName, ' +    @cols +'   FROM   

(SELECT
t1.Col_Name,
t2.Account,
t2.AccountName,
t2.Amount
FROM Table1 AS t1
JOIN Table2 AS t2 ON t1.Col_ID1 = t2.Col_ID2
) p

PIVOT
(
Sum ([Amount] )
FOR Col_Name IN
( '+
@cols +' )
) AS pvt ' 

Adapun injeksi SQL, satu-satunya cara saya dapat melihat hal itu terjadi adalah jika seseorang entah bagaimana menyematkan kode berbahaya dalam Table1.Col_Name, dan jika Anda harus mengkhawatirkannya, Anda memiliki masalah yang lebih besar daripada "mengunci" kueri dinamis ini.

Juga perlu disebutkan, saya akan menggunakan yang berikut ini untuk membuat daftar kolom (@Cols) karena lebih pendek dan lebih mudah dibaca, tetapi sebagian besar karena saya tidak suka XML.

DECLARE @cols NVARCHAR(2000)    
SELECT @cols = isnull(@cols + ',', '') + '[' + Col_Name + ']'
 FROM Table1
 ORDER BY Col_Name


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara mengekstrak dari data nilai DateTime tanpa detik

  2. Memahami QUOTED_IDENTIFIER

  3. Kunci asing yang fleksibel

  4. Gabungkan interval tanggal yang tumpang tindih

  5. Menghasilkan kode sql secara terprogram