簡體   English   中英

列名稱未知的SQL Server 2008數據透視表

[英]SQL Server 2008 pivoting table with unknown column name

我無法解決以下問題

    FirstName    LastName
    ----------------------
    Talyor       Swift
    Bruno        Mars

到以下

    ColumnName    ColumnValue
    --------------------------
    FirstName     Talyor
    LastName      Swift
    FirstName     Bruno
    LastName      Mars

我不知道如何對它進行硬編碼,特別是從系統中檢索列名稱的方法時,如何啟動它。

**未提供源表中的列名

這是一種通過XML完成的“動態”方法。

顯然,聯波觀察團的表現將更好

Select C.*
      ,ColumnOrder = D.ORDINAL_POSITION
 From  YourTable A
 Cross Apply (Select XMLData = cast((Select A.* for XML Raw) as xml) ) B
 Cross Apply (
                Select Item   = attr.value('local-name(.)','varchar(100)')
                      ,Value  = attr.value('.','varchar(max)') 
                 From  B.XMLData.nodes('/row') as n(r)
                 Cross Apply n.r.nodes('./@*') AS B(attr)
             ) C
 Join INFORMATION_SCHEMA.COLUMNS D on D.Table_Name='YourTable' and D.Column_Name=C.Item

返回

Item        Value   ColumnOrder
FirstName   Talyor  1
LastName    Swift   2
FirstName   Bruno   1
LastName    Mars    2

編輯-動態取消旋轉

Declare @SQL varchar(max) ='
Select ColumnOrder = D.ORDINAL_POSITION
      ,Item
      ,Value
 From  YourTable
 UnPivot (Value for Item in ('+Stuff((Select ',' +QuoteName(Name) 
                                       From  sys.columns 
                                       Where objecT_id = OBJECT_ID('YourTable') 
                                       For XML Path ('')),1,1,'')
                             +')) as UnPiv
 Join INFORMATION_SCHEMA.COLUMNS D on D.Table_Name=''YourTable'' and D.Column_Name=UnPiv.Item
'
--Print @SQL
Exec(@SQL)

從我在問題中看到的,這應該起作用:

select 'firstname', firstname from table
union all
select 'lastname', lastname from table

如果列名未知,則可以從sys.columns表中選擇它們,創建一個sql字符串,然后使用exec函數執行sql字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM