将行值从单列更改为不同的列名称

时间:2011-03-01 06:28:36

标签: sql

我有一个表EmpDetail,有三列:

EMP_NAME    DETAIL_ID    DETAIL
----------------------------------
ABC         ADDRESS      abc123
ABC         PHONE        12345
ABC         EMAIL        abc@xyz
BCD         ADDRESS      bcd234
BCD         PHONE        23456
BCD         EMAIL        bcd@345

我想创建一个新表,以便DETAIL_ID中的值成为新的列名:

EMP_NAME    ADDRESS    PHONE    EMAIL
----------------------------------------
ABC         abc123     12345    abc@xyz
BCD         bcd234     23456    bcd@345

我已经尝试加入,但我无法获得所需的结果。

请建议一种方法。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;
相关问题