Chuyển tên cột một cách linh hoạt cho UNPIVOT


10

Tôi có một bảng với dữ liệu sau

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

Và sử dụng UNPIVOT

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

Tôi nhận được kết quả như sau

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

Bây giờ câu hỏi của tôi là chúng ta có thể chuyển các tên cột một cách linh hoạt để UNPIVOTkhi các cột trong bảng tăng lên, chúng ta có thể không phải thay đổi câu lệnh.

Câu trả lời:


14

Nếu bạn sắp có một số cột không xác định mà bạn sẽ cần hủy liên kết, thì bạn sẽ phải xem xét triển khai SQL động.

Bạn có thể sử dụng sys.columnsđể lấy tên của tất cả các cột trong calbảng của mình . Nếu bạn sử dụng truy vấn sau, bạn sẽ nhận được danh sách tất cả các cột trong bảng của mình:

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

Bây giờ bạn có thể sử dụng truy vấn này cùng với FOR XML PATHđể tạo một danh sách các tên được phân tách bằng dấu phẩy được nối với một chuỗi sẽ được thực thi:

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

Cuối cùng, bạn sẽ lấy danh sách này và đặt nó vào chuỗi truy vấn của bạn để được thực thi để truy vấn đầy đủ sẽ như sau:

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;

Xem SQL Fiddle với bản demo

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.