Oracle11g oracle sql将所有行转换为列
我要将所有行翻转为列。因此,如果有以下5列 有3个数据行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
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 (
...