PIVOT多列T-SQL,生成列名

时间:2014-12-08 21:18:13

标签: sql sql-server-2008 pivot

- 原始问题底部的更新12/19 -

我有一张桌子

MYID  YEAR  Q1      Q2      Q3      Q4
----------------------------------------
UNIQ1   13  xxxx    xxxx    xxxx    xxxx
UNIQ1   12  xxxx    xxxx    xxxx    xxxx
UNIQ1   11  xxxx    xxxx    xxxx    xxxx
UNIQ2   13  xxxx    xxxx    xxxx    xxxx
UNIQ2   12  xxxx    xxxx    xxxx    xxxx
UNIQ2   11  xxxx    xxxx    xxxx    xxxx

我需要输出看起来像这样

MYID    11_Q1   11_Q2   11_Q3   11_Q4   12_Q1   12_Q2   12_Q3   12_Q4   13_Q1   13_Q2   13_Q3   13_Q4
---------------------------------------------------------------------------------------------------------
UNIQ1   xxxx    xxxx    xxxx    xxxx    xxxx    xxxx    xxxx    xxxx    xxxx    xxxx    xxxx    xxxx
UNIQ2   xxxx    xxxx    xxxx    xxxx    xxxx    xxxx    xxxx    xxxx    xxxx    xxxx    xxxx    xxxx

需要做两件事:

  1. 我需要年pivot(?)和
  2. 然后将年份附加到列名称。
  3. 我试过加入,工会,支点。我真的很茫然。感谢您的任何帮助。

    我正在使用SQL Server 2008。

    ----更新

    Becuzz慷慨提供的解决方案在上面的例子中完美地运作。但是,如果数据没有每年的值,则会出现问题。

    我的表看起来更像是这样:

    MYID  YEAR  Q1      Q2      Q3      Q4
    ----------------------------------------
    UNIQ1   13  xxxx    xxxx    xxxx    xxxx
    UNIQ1   12  xxxx    xxxx    xxxx    xxxx
    UNIQ1   11  xxxx    xxxx    xxxx    xxxx
    UNIQ2   13  xxxx    xxxx    xxxx    xxxx
    UNIQ2   12  xxxx    xxxx    xxxx    xxxx
    UNIQ2   11  xxxx    xxxx    xxxx    xxxx
    UNIQ3   11  xxxx    xxxx    xxxx    xxxx
    

    最终发生的是UNIQ3或所有年份不存在的任何价值被抛弃。我在SQL小提琴上演示了这一点。

    http://sqlfiddle.com/#!6/ffeab/1/0

    如果您在下面更改Becuzz的代码,请使用" OUTER APPLY"而不是" CROSS APPLY",当缺少年份时插入NULLS。

    所以输出看起来像这样:

    MYID    11_Q1   11_Q2   11_Q3   11_Q4   12_Q1   12_Q2   12_Q3   12_Q4   13_Q1   13_Q2   13_Q3   13_Q4
    ---------------------------------------------------------------------------------------------------------
    UNIQ1   xxxx    xxxx    xxxx    xxxx    xxxx    xxxx    xxxx    xxxx    xxxx    xxxx    xxxx    xxxx
    UNIQ2   xxxx    xxxx    xxxx    xxxx    xxxx    xxxx    xxxx    xxxx    xxxx    xxxx    xxxx    xxxx
    UNIQ3   xxxx    xxxx    xxxx    xxxx    null    null    null    null    null    null    null    null
    

1 个答案:

答案 0 :(得分:1)

这是动态SQL的工作之一。您必须将此调整到您的数据库,但以下应该这样做

declare @years table
(
    [year] int
)
insert into @years values (11)
insert into @years values (12)
insert into @years values (13)

declare @quarters table
(
    [quarter] varchar(10)
)
insert into @quarters values ('q1')
insert into @quarters values ('q2')
insert into @quarters values ('q3')
insert into @quarters values ('q4')

declare @query varchar(max)
select @query = 'select * from (select distinct id from tempdata) d' + stuff((select ' cross apply (select ' + stuff((select ','  + q.[quarter] + ' as [' + cast(y.[year] as varchar(10)) + '_' + q.[quarter] + ']' from @quarters q for xml path('')), 1, 1, '') + ' from tempdata dx where dx.id = d.id and dx.[year] = ' + cast(y.[year] as varchar(10)) + ') d' + cast(y.[year] as varchar(10)) from @years y for xml path('')), 1, 0, '')
exec(@query)

SQL Fiddle