2011-03-01 39 views
0

我有一个表,EmpDetail,有三列:更改行值到不同的列名

EMP_NAME DETAIL_ID DETAIL 
---------------------------------- 
ABC   ADDRESS  abc123 
ABC   PHONE  12345 
ABC   EMAIL  [email protected] 
BCD   ADDRESS  bcd234 
BCD   PHONE  23456 
BCD   EMAIL  [email protected] 

我想创建一个新表,使得从DETAIL_ID值成为新的列名:

EMP_NAME ADDRESS PHONE EMAIL 
---------------------------------------- 
ABC   abc123  12345 [email protected] 
BCD   bcd234  23456 [email protected] 

我已经尝试加入,但我无法得到期望的结果。

请建议一种方法来做到这一点。

+4

我不推荐做你想做的事 - 目前的设置是未来的证明,而你想要的是为每个属性添加列。 –

+0

单独留下格式 - 更易于阅读,更容易帮助...除非您真的不需要任何格式。 –

+0

我只有五个不同的值在我想作为列名的detail_id列中。 – Pranay

回答

1

下面是如何加入的只是两个细节,地址和电话的例子:

insert into NewTable 
     (EMP_NAME, ADDRESS, PHONE) 
select name.EMP_NAME 
,  addr.DETAIL 
,  phone.DETAIL 
from (
     select distinct EMP_NAME 
     from OldTable 
     ) name 
left join 
     OldTable addr 
on  addr.EMP_NAME = name.EMP_NAME 
     and addr.DETAIL_ID = 'ADDRESS' 
left join 
     OldTable phone 
on  phone.EMP_NAME = name.EMP_NAME 
     and phone.DETAIL_ID = 'PHONE' 

分组也适用,可能有点简单:

insert into NewTable 
     (EMP_NAME, ADDRESS, PHONE) 
select EMP_NAME 
,  max(case when DETAIL_ID = 'ADDRESS' then DETAIL end) 
,  max(case when DETAIL_ID = 'PHONE' then DETAIL end) 
from OldTable 
group by 
     EMP_NAME 
+0

非常感谢Andomar!该解决方案正在工作:) – Pranay

0
CREATE TABLE NewTable AS 
SELECT EMP_NAME , 
    wm_concat(ADDRESS) ADDRESS, 
    wm_concat(PHONE) PHONE, 
    wm_concat(EMAIL) EMAIL 
FROM 
    (SELECT EMP_NAME , 
    CASE 
     WHEN DETAIL_ID='ADDRESS' 
     THEN DETAIL 
     ELSE NULL 
    END ADDRESS , 
    CASE 
     WHEN DETAIL_ID='PHONE' 
     THEN DETAIL 
     ELSE NULL 
    END PHONE , 
    CASE 
     WHEN DETAIL_ID='EMAIL' 
     THEN DETAIL 
     ELSE NULL 
    END EMAIL 
    FROM EmpDetail 
) 
GROUP BY EMP_NAME;