- 原始问题底部的更新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
需要做两件事:
pivot
(?)和我试过加入,工会,支点。我真的很茫然。感谢您的任何帮助。
我正在使用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
答案 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)