oracle sql将所有行转换为列

时间:2018-07-26 10:30:32

标签: oracle11g

我想将所有行翻转为列。所以如果有以下5列 有3个数据行

@RequestMapping(value = {"/logout"}, method = RequestMethod.GET)
public String logout(HttpServletRequest request, SessionStatus session){
    session.setComplete();
    request.getSession().invalidate();
    return "login";
}

我希望结果集如下所示。所以有3列5行。

仅添加了COL标题(COL1-COL3)以使内容更清晰,我不需要 列标题

ACCT_ID       NAME           PHONE              MOBILE      ALTERNATIVE_NAME

01          JOE BROWN        0456-9992-6666    07767828432       ZOE BROWN

02          GILL SHARP       0456-9992-6666    07763928432       BILL SHARP

03          ZAC LOWE         0236-9992-5644    07663925672       LUKE LOWE

我尝试在一列(acct_id)上使用PIVOT

COL1                        COL2                             COL3

01                           02                               03

JOE BROWN                    GILL SHARP                      ZAC LOWE   

0456-9992-6666               0456-9992-6666                  0236-9992-5644

07767828432                  07763928432                     07663925672

ZOE BROWN                    BILL SHARP                      LUKE LOWE

返回以下内容

Select *
from

(
  select ACCT_ID 
  from TABLE 
  ) 
pivot

(
   max(ACCT_ID) as ACCT_ID 
   for ACCT_ID in ('01','02','03') 
) 

在正确的轨道上。只需扩展到包括其他4列(NAME,PHONE,MOBILE,ALTERNATIVE_CONTACT),这些列在关联的acct_id下列出。 所以最后有5行。

任何人都可以帮忙。

1 个答案:

答案 0 :(得分:0)

您可以使用一系列大小写表达式对其进行暴力破解:

select max(case when acct_id = '01' then acct_id end) as col1,
       max(case when acct_id = '02' then acct_id end) as col2,
       max(case when acct_id = '03' then acct_id end) as col3
from your_table
union all
select max(case when acct_id = '01' then name end),
       max(case when acct_id = '02' then name end),
       max(case when acct_id = '03' then name end)
from your_table
union all
select max(case when acct_id = '01' then phone end),
       max(case when acct_id = '02' then phone end),
       max(case when acct_id = '03' then phone end)
from your_table
... repeat for other columns

COL1           COL2           COL3          
-------------- -------------- --------------
01             02             03            
JOE BROWN      GILL SHARP     ZAC LOWE      
0456-9992-6666 0456-9992-6666 0236-9992-5644
...

或者您可以取消透视和重新透视,这很麻烦,可能要做的工作超出实际需要:

select col1, col2, col3
from (
  select t.*, t.acct_id as col_id
  from your_table t
)
unpivot
(
  value for heading in (acct_id, name, phone, mobile, alternative_name)
)
pivot
(
  max(value) for col_id in ('01' as col1, '02' as col2, '03' as col3)
)
order by case heading when 'ACCT_ID' then 1 when 'NAME' then 2 when 'PHOEN' then 3
                      when 'MOBILE' then 4 when 'ALTERNATIVE_NAME' then 5 end

COL1           COL2           COL3          
-------------- -------------- --------------
01             02             03            
JOE BROWN      GILL SHARP     ZAC LOWE      
07767828432    07763928432    07663925672   
ZOE BROWN      BILL SHARP     LUKE LOWE     
0456-9992-6666 0456-9992-6666 0236-9992-5644

仅存在用于添加伪col_id表达式的子查询,因此您可以在acct_id上进行微调,并将其包括在结果中。

如果要在最终结果中包括原始列名作为标题列,请将其添加到第一个选择列表中:

select heading, col1, col2, col3
from (
...

仅当您知道(最多)三行(并且基于固定帐户ID,尽管可以修复)时,此方法才有效;如果您不知道最终结果需要多少列,那么您需要查看动态SQL。