2016-06-30 33 views
0

我在Oracle SQL中将表A作为输入。 表A:根据其他列中的公共值将一列水平分割为多列

+-----------+---------+------+-----+ 
| Col1 | Col2 | Col3 | Col4| 
+-----------+---------+------+-----+ 
|  a | g | 1 | ABC | 
|  b | h | 2 | ABC | 
|  c | i | 1 | DEF | 
|  d | j | 2 | DEF | 
|  e | k | 1 | GHI | 
|  f | l | 2 | GHI | 
+-----------+---------+------+-----+ 

我想要分割的每一列1和列2的水平基于COL4的值。 Col3是1或2,如图所示。 输出表:

+-----------+---------+------+-----+----+ 
| Col5 | Col6 | Col7 | Col8|Col9| 
+-----------+---------+------+-----+----+ 
|  a | g | b | h | ABC| 
|  c | i | d | j | DEF| 
|  e | k | f | l | GHI| 
+-----------+---------+------+-----+----+ 

回答

0

我觉得你只是想有条件聚集:

select max(case when col3 = 1 then col1 end) as col5, 
     max(case when col3 = 1 then col2 end) as col6, 
     max(case when col3 = 2 then col1 end) as col7, 
     max(case when col3 = 2 then col2 end) as col8, 
     col4 as col9 
from tablea a 
group by col4; 
1

甲骨文设置

CREATE TABLE table_name (Col1, Col2, Col3, Col4) 
    SELECT 'a', 'g', 1, 'ABC' FROM DUAL UNION ALL 
    SELECT 'b', 'h', 2, 'ABC' FROM DUAL UNION ALL 
    SELECT 'c', 'i', 1, 'DEF' FROM DUAL UNION ALL 
    SELECT 'd', 'j', 2, 'DEF' FROM DUAL UNION ALL 
    SELECT 'e', 'k', 1, 'GHI' FROM DUAL UNION ALL 
    SELECT 'f', 'l', 2, 'GHI' FROM DUAL; 

查询

SELECT N1_C1 AS Col5, 
     N1_C2 AS Col6, 
     N2_C1 AS Col7, 
     N2_C2 AS Col8, 
     Col4 AS Col9 
FROM table_name 
PIVOT (MAX(Col1) AS C1, MAX(Col2) AS C2 
     FOR Col3 IN (1 AS N1, 2 AS N2)); 

输出

COL5 COL6 COL7 COL8 COL9 
---- ---- ---- ---- ---- 
a g b h ABC 
c i d j DEF 
e k f l GHI 
1

这是一个直接应用自联接:

with 
    test_data (col1, col2, col3, col4) as ( 
     select 'a', 'g', 1, 'ABC' from dual union all 
     select 'b', 'h', 2, 'ABC' from dual union all 
     select 'c', 'i', 1, 'DEF' from dual union all 
     select 'd', 'j', 2, 'DEF' from dual union all 
     select 'e', 'k', 1, 'GHI' from dual union all 
     select 'f', 'l', 2, 'GHI' from dual 
    ) 
select td1.col1 as col5, td1.col2 as col6, td2.col1 as col7, 
     td2.col2 as col8, td1.col4 as col9 
from test_data td1 inner join test_data td2 on td1.col4 = td2.col4 
where td1.col3 = 1 and td2.col3 = 2 
; 

COL5 COL6 COL7 COL8 COL9 
---- ---- ---- ---- ---- 
a g b h ABC 
c i d j DEF 
e k f l GHI 
相关问题