T-SQL动态支点

时间:2017-06-28 11:29:05

标签: tsql pivot-table dynamic-pivot

我正在尝试生成一个包含动态列名的数据透视表,但却失败了。

我的表格结构如下:

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 个答案:

答案 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

<强>返回

enter image description here