การส่งชื่อคอลัมน์แบบไดนามิกไปที่ UNPIVOT


10

ฉันมีตารางที่มีข้อมูลต่อไปนี้

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

และการใช้งาน UNPIVOT

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

ฉันได้รับผลลัพธ์ต่อไปนี้

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

ตอนนี้คำถามของฉันคือเราสามารถส่งชื่อคอลัมน์แบบไดนามิกไปยังUNPIVOTเพื่อให้เมื่อคอลัมน์ในตารางเพิ่มขึ้นเราอาจไม่ต้องแก้ไขคำสั่ง

คำตอบ:


14

หากคุณจะมีจำนวนคอลัมน์ที่ไม่รู้จักที่คุณจะต้องยกเลิกการหมุนคุณจะต้องดูที่การใช้ SQL แบบไดนามิก

คุณสามารถใช้sys.columnsเพื่อรับชื่อของคอลัมน์ทั้งหมดในcalตารางของคุณ หากคุณใช้แบบสอบถามต่อไปนี้คุณจะได้รับรายการคอลัมน์ทั้งหมดในตารางของคุณ:

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

ตอนนี้คุณสามารถใช้FOR XML PATHคิวรีนี้พร้อมกับเพื่อสร้างรายการชื่อที่คั่นด้วยเครื่องหมายจุลภาคเพื่อต่อกับสตริงที่จะดำเนินการ:

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

ในที่สุดคุณจะนำรายการนี้และวางลงในสตริงการสืบค้นของคุณเพื่อดำเนินการดังนั้นแบบสอบถามแบบเต็มจะมีลักษณะดังนี้:

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;

ดูSQL Fiddle พร้อมเดโม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.