2013-04-03 51 views
-1

我有两个这样的表。Sql列到行连接表

--------------------------------------------------- 
| AltID  | Alan 1| Alan 2 | Alan 3 | UserId | 
--------------------------------------------------- 
| 1   | Opel | null | Engine | 5121 | 
| 2   | Home | Garden | null | 5653 | 
| 3   | null | null | null | 2133 | 
--------------------------------------------------- 

------------------------------------- 
| UserId  | Kolon | NewValue | 
------------------------------------- 
| 2133   | Alan 1 | null  | 
| 2133   | Alan 2 | null  | 
| 2133   | Alan 3 | null  | 
| 5121   | Alan 1 | Brand | 
| 5121   | Alan 2 | Model | 
| 5121   | Alan 3 | Part  | 
| 5653   | Alan 1 | Place | 
| 5653   | Alan 2 | Point | 
| 5653   | Alan 3 | Take  | 
------------------------------------- 

我努力得到的结果一样,

----------------------------------------------------- 
| UserId  | Kolon | NewValue | AltID | Deger | 
----------------------------------------------------- 
| 2133   | Alan 1 | null  | 3 | null | 
| 2133   | Alan 2 | null  | 3 | null | 
| 2133   | Alan 3 | null  | 3 | null | 
| 5121   | Alan 1 | Brand | 1 | Opel | 
| 5121   | Alan 2 | Model | 1 | null | 
| 5121   | Alan 3 | Part  | 1 | Engine| 
| 5653   | Alan 1 | Place | 2 | Home | 
| 5653   | Alan 2 | Point | 2 | Garden| 
| 5653   | Alan 3 | Take  | 2 | null | 
----------------------------------------------------- 

我只是试着做了unpivot但不可能加入其他表到下它。可以帮我吗?

+0

请注明您通过添加适当的标记(Oracle,SQL Server,MySQL等)来定位RDBMS。可能会有利用不被普遍支持的语言或产品功能的答案。此外,通过使用特定的RDBMS标记它,您的问题可能会得到更适合回答的人的关注。 – Taryn

回答

1

如果您正在使用SQL Server 2008+,那么你就可以逆转置Table1使用CROSS APPLYVALUES条款再加入上Table2

select t1.userid, 
    t2.Kolon, 
    t2.newvalue, 
    t1.altid, 
    t1.Deger 
from 
(
    select AltId, col, Deger, UserId 
    from table1 t1 
    cross apply 
    (
    values ('Alan 1', [Alan 1]), 
      ('Alan 2', [Alan 2]), 
      ('Alan 3', [Alan 3]) 
) c (col, Deger) 
) t1 
inner join table2 t2 
    on t1.userid = t2.userid 
    and t1.col = t2.Kolon 
order by t1.userid; 

SQL Fiddle with Demo

+1

非常合作非常感谢你.. – cooolstaff

+0

@cooolstaff不客气!乐于帮助。 – Taryn

+1

CROSS APPLY的好解决方案;)+ 1 –

1
select a.UserId, a.Kolon, a.NewValue, b.AltID, 
     case a.Kolon when 'Alan 1' then [Alan 1] 
        when 'Alan 2' then [Alan 2] 
        when 'Alan 3' then [Alan 3] end Deger 
    from Tbl2 a 
    join Tbl1 b on a.UserId = b.UserId;