2011-05-20 85 views
0

SQL Server 2008中,我有以下父/子表的图式和行:SQL Server 2008透视键值加入父?

create table #par(parid int primary key identity(1,1) , partext varchar(6)) 
create table #chi(chiid int primary key identity(1,1) , parid int null , chirefid int null , chiinfo varchar(6)) 
create table #chiref (chirefid int primary key identity(1,1) , chisubdesc varchar(9)) 

insert into #par values ('par1') , ('par2') 

insert into #chiref values ('chi1') 
insert into #chiref values ('chi2') 
insert into #chiref values ('chi3') 

insert into #chi values (1 , 1 , 'aaa') 
insert into #chi values (1 , 2 , 'bbb') 
insert into #chi values (2 , 1 , 'ccc') 
insert into #chi values (2 , 2 , 'ddd') 
insert into #chi values (2 , 3 , 'eee') 

孩子#chi刚刚键/值对里面,我需要的文本(键)转换成列并把值放在里面,所以结果集的形状如下。什么是最好的方式做到这一点(我不能改变的关键/价值的东西,它是从另一个系统继承)。 #chiref表中有一个实际列名的连接(这实际上让我很难过)。

partext  chi1  chi2  chi3 
par1  aaa  bbb 
par2  ccc  ddd  eee 

谢谢。

编辑 - 要记住的是,列名必须匹配表中的“键值”。所以如果EAV行键是“chi1”,那么主键必须有“chi1”。我只是打破了“1”。所以我明白了。

再次感谢!

回答

2
select partext, [chi1], [chi2], [chi3] 
from 
(
    select p.partext, c.chitext, c.chiinfo 
    from #chi c 
     join #par p 
      on c.parid = p.parid 
) AS SourceTable 
pivot 
(
    min(chiinfo) 
    for chitext in ([chi1], [chi2], [chi3]) 
) as PivotTable 

或这个人是有点更有效,虽然越来越多的代码:

with c 
as 
(
    select parid, [chi1], [chi2], [chi3] 
    from 
    (
     select parid, chitext, chiinfo 
     from #chi 
    ) AS SourceTable 
    pivot 
    (
     min(chiinfo) 
     for chitext in ([chi1], [chi2], [chi3]) 
    ) as PivotTable 
) 
select p.partext, c.* 
from c 
join #par p 
    on c.parid = p.parid 

,如果你需要一个动态的列数,你可以做动态查询:

declare @ColumnList varchar(max) 

select @ColumnList = isnull(@columnList + ', ', '') + '[' + chitext + ']' 
from 
(
    select distinct chitext 
    from #chi 
) tt 
order by chitext 

declare @Command varchar(max) = ' 
    with c 
    as 
    (
     select parid, ' + @ColumnList + ' 
     from 
     (
      select parid, chitext, chiinfo 
      from #chi 
     ) AS SourceTable 
     pivot 
     (
      min(chiinfo) 
      for chitext in (' + @ColumnList + ') 
     ) as PivotTable 
    ) 
    select p.partext, ' + @ColumnList + ' 
    from c 
    join #par p 
     on c.parid = p.parid 
' 
execute(@Command) 
+0

感谢。我试图添加一个连接条件来获取pivoted数据的正确列名称,而pivot不喜欢它。我更新了原始帖子。联接应该如何工作? – Snowy 2011-05-25 21:01:49