Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
Oracle11g oracle sql将所有行转换为列_Oracle11g - Fatal编程技术网

Oracle11g oracle sql将所有行转换为列

Oracle11g oracle sql将所有行转换为列,oracle11g,Oracle11g,我要将所有行翻转为列。因此,如果有以下5列 有3个数据行 ACCT_ID NAME PHONE MOBILE ALTERNATIVE_NAME 01 JOE BROWN 0456-9992-6666 07767828432 ZOE BROWN 02 GILL SHARP 0456-9992-6666 07763928432 BI

我要将所有行翻转为列。因此,如果有以下5列 有3个数据行

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
我希望结果集如下所示。所以有3列5行

列标题(COL1-COL3)的添加只是为了更清楚,我不需要 列标题

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
我尝试在一列上使用PIVOT(帐户id)

这将返回以下结果

'01'_ACCT_ID    '02'_ACCT_ID      '03'_ACCT_ID

01                  02                  03
在正确的轨道上。只需扩展到包含相关帐户id下列出的其他4列(姓名、电话、手机、备选联系人)。 因此,以5行结束


有人能帮忙吗

您可以使用一系列大小写表达式对其进行强制:

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
...
或者,您可以取消pivot并重新旋转,这会很混乱,而且可能会做比实际需要更多的工作:

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\u id
表达式的子查询仅在那里,这样您就可以在账户id上进行picot操作,并将其包含在结果中

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

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

只有当您知道最多有三行(并且基于固定帐户ID,尽管这是固定的)时,这才有效;如果您不知道最终结果需要多少列,那么您需要查看动态SQL。

请格式化任何代码,使您的文章更易于他人阅读。ctrl+k将有助于格式化为代码,从而提高可读性如果有固定数量的起始列(即5列),使用unpivot和pivot动态SQL会是什么样子,但是任何数量的起始行。我在示例中使用了acct_id'01,'02,'03',但acct_id可以是任何值,因此无法引用sql中的值,并且可以是第1到第n行。@JSQL-不确定当时为什么不回复;它会说,动态方法与您最初的问题相去甚远,而且太多,无法添加到这个答案中(更不用说作为一个评论),因此您需要就此提出一个单独的问题。但我可以看到你还是这样做了——我当时没有看到,但我现在已经添加了一个答案,以防它仍然是你需要的东西。
select heading, col1, col2, col3
from (
...