表转换 - Oracle

时间:2010-09-09 04:49:09

标签: sql oracle plsql pivot sqlplus

我有一个具有这种结构的表:

date  colname   value
----------------------------
date  col1name  col1's value  
date  col2name  col2's value  
date  col3name  col3's value  

现在我需要将其转换为这种结构:

date col1name       col2name      col3name  
-----------------------------------------------
date col1's value   col2's value  col3's value  

有可能吗?

1 个答案:

答案 0 :(得分:2)

您想要一个数据透视表:

  SELECT t.date,
         MAX(CASE WHEN t.colname = 'col1name' THEN t.value END) AS col1name,
         MAX(CASE WHEN t.colname = 'col2name' THEN t.value END) AS col2name,
         MAX(CASE WHEN t.colname = 'col3name' THEN t.value END) AS col3name
    FROM TABLE t
GROUP BY t.date

如果要根据colname值使其动态化,则需要使用dynamic SQL,因为在构造实际查询之前需要先获取colname值列表。

Oracle直到11g才添加PIVOT / UNPIVOT支持。支持CASE表达式9i +;在9i之前你必须使用DECODE ......