Melewati nama kolom secara dinamis ke UNPIVOT

10

Saya punya tabel dengan data berikut

First         Second        Third         Fourth        Fifth         Sixth
2013-08-20    2013-08-21    2013-08-22    2013-08-23    2013-08-24    2013-08-25

Dan menggunakan UNPIVOT

SELECT Data
    ,DATENAME(DW, Data) AS DayName
FROM Cal
UNPIVOT(Data FOR D IN (
            First,
            Second,
            Third,
            Fourth,
            Fifth,
            Sixth  )) AS unpvt

Saya mendapatkan hasil sebagai berikut

Data        DayName
2013-08-20  Tuesday
2013-08-21  Wednesday
2013-08-22  Thursday
2013-08-23  Friday
2013-08-24  Saturday
2013-08-25  Sunday

Sekarang pertanyaan saya adalah dapatkah kita meneruskan nama kolom secara dinamis UNPIVOTsehingga ketika kolom dalam tabel bertambah, kita mungkin tidak perlu mengubah pernyataan.

Sai Chaitanya M
sumber

Jawaban:

14

Jika Anda akan memiliki jumlah kolom yang tidak diketahui yang harus Anda batalkan unpivot, maka Anda harus melihat penerapan SQL dinamis.

Anda bisa menggunakan sys.columnsuntuk mendapatkan nama-nama semua kolom di caltabel Anda . Jika Anda menggunakan kueri berikut, Anda akan mendapatkan daftar semua kolom di tabel Anda:

select C.name
from sys.columns c
where c.object_id = OBJECT_ID('dbo.cal') 

Sekarang Anda dapat menggunakan kueri ini bersama dengan FOR XML PATHuntuk membuat daftar nama yang dipisahkan koma untuk digabungkan ke string yang akan dieksekusi:

select @colsUnpivot 
  = stuff((select ','+quotename(C.name)
           FROM sys.columns c
           WHERE c.object_id = OBJECT_ID('dbo.cal') 
           for xml path('')), 1, 1, '')

Akhirnya, Anda akan mengambil daftar ini dan menempatkannya ke dalam string kueri Anda untuk dieksekusi sehingga kueri lengkap akan terlihat seperti:

DECLARE @colsUnpivot AS NVARCHAR(MAX),
   @query  AS NVARCHAR(MAX)

select @colsUnpivot 
  = stuff((select ','+quotename(C.name)
           FROM sys.columns c
           WHERE c.object_id = OBJECT_ID('dbo.cal') 
           for xml path('')), 1, 1, '')

set @query 
  = 'select data, datename(dw, data) dayname
     from cal
     unpivot
     (
        data
        for d in ('+ @colsunpivot +')
     ) u'

exec sp_executesql @query;

Lihat SQL Fiddle dengan Demo

Taryn
sumber