2017-06-28 71 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