Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql oracle将文本值行转换为列_Sql_Oracle_Pivot - Fatal编程技术网

Sql oracle将文本值行转换为列

Sql oracle将文本值行转换为列,sql,oracle,pivot,Sql,Oracle,Pivot,在Oracle中,我有一个设计如下的表 +-----------+------+-------+ | ID | TYPE | VALUE | +-----------+------+-------+ | 1 | A | 1 | | 1 | B | 2 | | 1 | C | 3 | | 2 | A | 4 | | 2 | B | 5

在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)
)
这就是我的问题

  • 这将返回结果,但即使结果不为null,也会返回null值。它返回NULL是因为我使用的聚合函数具有字符串值吗
  • 此SQL不会将值映射到类型。所以基本上,值总是需要绑定到类型列。使用PIVOT函数是否可行
    我还考虑通过使用INSERT和SELECT来重新创建表。请告知使用PIVOT是否可行。

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

    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;
    

    您可以使用
    createtableas
    将结果插入表中。这也适用于pivot查询。

    我发现只使用条件聚合要容易得多:

    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;
    

    您可以使用
    createtableas
    将结果插入表中。这也适用于pivot查询。

    pivot的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:


    枢轴的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:


    你需要的不是1,2,3,而是“A”,“B”,“C”而不是1,2,3,你需要的是“A”,“B”,“C”,我也需要;而且它在多个数据库平台上的支持更为通用。@xQbert-虽然所有这些都是事实,但如果一个数据库在Oracle中实际工作并且效率很重要,那么PIVOT应该是首选;与“旧”或“手动”的旋转方式相比,它的CPU密集度要低得多。例如,请参阅好的链接和信息。@mathguy。有趣。在SQL Server上正好相反。谢谢大家的评论。我试过Pivot,但因为数据集很小,我就用这种方法;而且它在多个数据库平台上的支持更为通用。@xQbert-虽然所有这些都是事实,但如果一个数据库在Oracle中实际工作并且效率很重要,那么PIVOT应该是首选;与“旧”或“手动”的旋转方式相比,它的CPU密集度要低得多。例如,请参阅好的链接和信息。@mathguy。有趣。在SQL Server上正好相反。谢谢大家的评论。我试过Pivot,但因为数据集很小,所以我就用这种方式。