Sql Oracle将行透视到列

Sql Oracle将行透视到列,sql,oracle,pivot,inner-join,aggregate-functions,Sql,Oracle,Pivot,Inner Join,Aggregate Functions,我有以下表格: TABLE1 ------ id name 1 n1 2 n2 TABLE2 ------ id tipo valor 1 t1 v1 1 t2 v2 2 t1 v1 2 t2 v5 2 t3 v3 我正试图得到: id name t1 t2 t3 1 n1 v1 v2 - 2 n2 v1 v5 v3 可能吗?我一直在寻找例子,但仍然没有弄清楚 谢谢大家! 您可以使用条件聚合: select t1.id, t1.name,

我有以下表格:

TABLE1
------
id name
1  n1
2  n2


TABLE2
------
id tipo valor
1  t1   v1
1  t2   v2
2  t1   v1
2  t2   v5
2  t3   v3
我正试图得到:

id name t1 t2 t3
1  n1   v1 v2 -
2  n2   v1 v5 v3
可能吗?我一直在寻找例子,但仍然没有弄清楚


谢谢大家!

您可以使用条件聚合:

select t1.id, t1.name,
    max(case when t2.typo = 't1' then t2.valor end) as t1,
    max(case when t2.typo = 't2' then t2.valor end) as t2,
    max(case when t2.typo = 't3' then t2.valor end) as t3
from table1 t1
inner join table2 t2 on t2.id = t1.id
group by t1.id, t1.name
这将为不存在的
typo
s返回
null
值。如果您想改为使用
'-'
,可以使用
coalesce()
包围条件聚合,如下所示:

    coalesce(max(case when t2.typo = 't1' then t2.valor end), '-') as t1

一种选择是使用
PIVOT
子句

SELECT *
  FROM (SELECT t1.*, t2.tipo, t2.valor 
          FROM table1 t1 
          JOIN table2 t2 
            ON t2.id = t1.id)
 PIVOT 
 (
  MAX(valor) FOR tipo IN ( 't1' AS "t1", 't2' AS "t2", 't3' AS "t3" )
 )  
但这是静态的,例如,需要在添加
tipo
列的不同值时进行更新。为了使其动态化,您可以创建一个函数

CREATE OR REPLACE FUNCTION Get_Pivoted_Cols RETURN SYS_REFCURSOR IS
  v_recordset SYS_REFCURSOR;
  v_sql       VARCHAR2(32767); 
  v_cols      VARCHAR2(32767);      
BEGIN
  SELECT LISTAGG( ''''||tipo||''' AS "'||tipo||'"' , ',' )
          WITHIN GROUP ( ORDER BY tipo )  
    INTO v_cols
    FROM ( SELECT DISTINCT tipo FROM table2 );

  v_sql := 'SELECT *
              FROM (SELECT t1.*, t2.tipo, t2.valor 
                      FROM table1 t1 
                      JOIN table2 t2 
                        ON t2.id = t1.id)
             PIVOT 
             (
              MAX(valor) FOR tipo IN ( '|| v_cols ||' )
             )';   

  OPEN v_recordset FOR v_sql;
  RETURN v_recordset;
END;
/
然后使用

VAR rc REFCURSOR
EXEC :rc := Get_Pivoted_Cols;
PRINT rc
从SQL开发人员控制台