2013-04-03 60 views
0

一個有一個表 「研究」 與列 「ID」, 「代碼1」, 「代碼2」, 「SOC0」, 「SOC1」 ... 「SOCN」 ,其中n = 40。如何正確書寫UNPIVOT?

細胞的值不是此刻的重要,因爲我需要得到像「SOC」列的列表:

soc0 
soc1 
.... 
soc40 

能否請你幫我寫了unpivot查詢?

+0

此問題未顯示任何研究工作。 **做你的作業很重要**。告訴我們你發現了什麼,***爲什麼它不符合你的需求。這表明你已經花時間去嘗試幫助你自己了,它使我們避免重申明顯的答案,最重要的是它可以幫助你得到更具體和相關的答案。 [FAQ](http://stackoverflow.com/questions/how-to-ask)。 – Kermit

+1

如果你只想列的名字,那麼你爲什麼要使用'UNPIVOT'表操作符呢?爲什麼不直接從'information_schema.columns'讀取這些列的名字? –

+0

to FreshPrince - 我做了作業,所有主題都描述瞭如何轉換表格的值。但是,因爲我傷心,我只需要專欄來說明我的進一步行動。馬哈茂德的 - 我必須得到相同的結果。其中之一是與information_schema.columns和我做到了。另一個任務是使用unpivot函數得到結果。這就是我尋求幫助的原因。 – Almazini

回答

3

可以使用UNPIVOT函數來獲取此。

的基本語法是:

select * 
from research 
unpivot 
(
    value 
    for col in (soc0, soc1, soc40) 
) un; 

SQL Fiddle with Demo

但你必須輸入了所有要unpivot的列名。如果你不想類型的所有列名,那麼你可以使用動態SQL:

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

select @colsUnpivot = stuff((select ','+quotename(C.column_name) 
     from information_schema.columns as C 
     where C.table_name = 'research' and 
       C.column_name like 'soc%' 
     for xml path('')), 1, 1, '') 

set @query 
    = 'select id, col, value 
    from research 
    unpivot 
    (
     value 
     for col in ('+ @colsunpivot +') 
    ) u' 

exec(@query) 

SQL Fiddle with Demo

但如果你只是想列名的列表,然後你就可以查詢這直接不逆透視:

select C.table_name, C.column_name 
from information_schema.columns c 
where C.table_name = 'research' and 
    C.column_name like 'soc%' 

SQL Fiddle with Demo

1

試試這個

select unpvt.value 
from research c 
unpivot ( 
value 
for attribute in (Colsoc0,Colsoc1,Colsoc2,..,Colsocn) 
) unpvt