oracle将文本值行转置为列

时间:2017-05-03 15:47:29

标签: sql oracle pivot

我在Oracle中有一个如下设计的表

+-----------+------+-------+
|    ID     | TYPE | VALUE | 
+-----------+------+-------+
| 1         | A    |     1 |
| 1         | B    |     2 |
| 1         | C    |     3 |
| 2         | A    |     4 |
| 2         | B    |     5 |
| 2         | C    |     6 |
+-----------+------+-------+

我需要像这样转换这个表

    +-----------+------+-------+-----+
    |    ID     | A    |     B |   C | 
    +-----------+------+-------+-----+
    | 1         | 1    |     2 |   3 |
    | 2         | 4    |     5 |   6 |
    +-----------+------+-------+-----+

下面是我用oracle pivot函数编写的sql,用于将这些行转换为列。

select * from
(
select ID, TYPE, VALUE from table where TYPE in ('A','B','C')
)
PIVOT (
max(value)
for TYPE in (1 column_a, 2 column_b, 3 column_c)
)

所以这些是我的问题

  1. 返回结果但返回null值,即使它不为null。它是否返回NULL,因为我正在使用带字符串值的聚合函数?
  2. 此SQL不会将值映射到该类型。所以基本上值总是需要绑定到类型列。这是否适用于PIVOT功能?
  3. 我也在考虑使用INSERT和SELECT重新创建表。请告知使用PIVOT是否可行。

2 个答案:

答案 0 :(得分:1)

我发现使用条件聚合更容易:

select id,
       max(case when type = 'A' then value end) as a,
       max(case when type = 'B' then value end) as b,
       max(case when type = 'C' then value end) as c
from t
group by id;

您可以使用create table as将结果插入表格中。这也适用于透视查询。

答案 1 :(得分:0)

1,2,3的角度应该是' A',' B'' C'

with CTE (ID,Type,Value) as (
SELECT 1, 'A',1 from dual union all
SELECT 1, 'B',2 from dual union all
SELECT 1, 'C',3 from dual union all
SELECT 2, 'A',4 from dual union all
SELECT 2, 'B',5 from dual union all
SELECT 2, 'C',6 from dual)

SELECT * 
FROM (SELECT ID, TYPE, VALUE FROM cte WHERE TYPE in ('A','B','C'))  
PIVOT (sum(value)
       for TYPE in ('A' "A",'B' "B",'C' "C"))  --Type has values of A,B,C so you have 
                                               --to pivot on A,B,C.. 1,2,3 are the values.

它是否返回NULL因为我正在使用带字符串值的聚合函数? 不,因为你正在转向错误的事情。在类型上进行数据透视而不是类型值

此SQL不会将值映射到该类型。 *仅仅因为你在我看来错误的做法......

所以基本上值总是需要绑定到类型列。这是否适用于PIVOT功能? 是的,在我看来,你只差了3个字符

工作的IMG示例:

enter image description here