2017-06-28 116 views
-1

我正在嘗試使用動態列名生成數據透視表,但失敗的可悲。T-SQL動態樞軸

我的表結構如下:

id, int() PKEY 
prod_no, VARCHAR(20) 
f_month, INT 
f_year, INT 
f_value, INT 

樣本數據看起來像這樣

------------------- 
AB1234|1|2016|15698 
------------------- 
AB1234|2|2016|25438 
------------------- 
AB1234|3|2016|53323 
------------------- 
AB1234|1|2017|34535 
------------------- 
AB1234|2|2017|66244 
------------------- 
AB1234|3|2017|54534 
------------------- 
CD9876|1|2016|43278 
------------------- 
CD9876|2|2016|11245 
------------------- 
CD9876|3|2016|82432 
------------------- 
CD9876|1|2017|93563 
------------------- 
CD9876|2|2017|89356 
------------------- 
CD9876|3|2017|45724 
------------------- 

結果我之後是這樣的:

prod_no|1-2016|2-2016|3-2016|1-2017|2-2017|3-2017| 
-------------------------------------------------- 
AB1234 |15698 |25438 |53323 |34535 |66244 |54534 | 
-------------------------------------------------- 
CD9876 |43278 |11245 |82432 |93563 |89356 |45724 | 

所以列作爲prod_no,後面跟動態列是f_month-f_year的串聯將數據作爲與該列中的月份年對應的產品編號和值。

我有一些動態的支點例子發揮各地從網絡,但到目前爲止與得到這個沒有運氣的工作

回答

2

試試這個:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX); 



SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(varchar,c.f_month)+'-'+convert(varchar,c.f_year)) 
      FROM dynpi c 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 
print @cols 

set @query = 'SELECT prod_no,' + @cols + ' from 
      (
       select prod_no, f_value,convert(varchar,f_month)+''-''+convert(varchar,f_year) as dyn 

       from dynpi 
      ) x 
      pivot 
      (
       max(f_value) 
       for dyn in (' + @cols + ') 
      ) p ' 


execute(@query) 

結果是:

*---------*---------*-------*-------*-------*-------*------* 
|prod_no |1-2016 |1-2017 |2-2016 |2-2017 |3-2016 |3-2017| 
*---------*---------*-------*-------*-------*-------*------* 
|AB1234 |15698 |34535 |25438 |66244 |53323 |54534 | 
*---------*---------*-------*-------*-------*-------*------* 
|CD9876 |43278 |93563 |11245 |89356 |82432 |45724 |  
*---------*---------*-------*-------*-------*-------*------* 
+0

完美!我將如何將其推入臨時表中進行查詢?我試圖「從dynpi進入## temp_table」,但得到語法錯誤 – user3818264

0

這將保持所需的列序列

Declare @SQL varchar(max) = ' 
Select * 
From (
     Select prod_no 
       ,item = concat(f_year,''-'',f_month) 
       ,value = f_value 
     From YourTable 
    ) A 
Pivot (sum([value]) For [Item] in (' + Stuff((Select ','+QuoteName(concat(f_year,'-',f_month)) 
               From (Select Distinct Top 100 f_year,f_month From YourTable Order By f_Year,f_month) A 
               For XML Path('')),1,1,'') + ')) p' 
Exec(@SQL) 
--Print @SQL 

返回

enter image description here