我正在尝试生成一个包含动态列名的数据透视表,但却失败了。
我的表格结构如下:
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的串联 数据作为产品编号和与该列中的月份相对应的值。
我玩了一些来自网络的动态数据透视示例,但到目前为止还没有运气让它发挥作用
答案 0 :(得分: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 |
*---------*---------*-------*-------*-------*-------*------*
答案 1 :(得分: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
<强>返回强>