我正在使用oracle 11g,我有一个返回两行或更少的查询,这样的事情
╔═══════════╦═════════════╗
║ Number ║ NAME ║
╠═══════════╬═════════════╣
║ 1 ║ Steve ║
║ 2 ║ John ║
╚═══════════╩═════════════╝
它也可能看起来回归
╔═══════════╦═════════════╗
║ Number ║ NAME ║
╠═══════════╬═════════════╣
║ 1 ║ Steve ║
║ 1 ║ Steve ║
╚═══════════╩═════════════╝
或者这个
╔═══════════╦═════════════╗
║ Number ║ NAME ║
╠═══════════╬═════════════╣
║ 1 ║ Steve ║
╚═══════════╩═════════════╝
我想重新排列数据
╔═══════════╦═════════════╦═════════════╗
║ whatever ║ NAME1 ║ NAME2 ║
╠═══════════╬═════════════╬═════════════╣
║ ss ║ Steve ║ John ║
╚═══════════╩═════════════╩═════════════╝
或者在另一种情况下
╔═══════════╦═════════════╦═════════════╗
║ whatever ║ NAME1 ║ NAME2 ║
╠═══════════╬═════════════╬═════════════╣
║ ss ║ Steve ║ Steve ║
╚═══════════╩═════════════╩═════════════╝
或者在一行的情况下
╔═══════════╦═════════════╦═════════════╗
║ whatever ║ NAME1 ║ NAME2 ║
╠═══════════╬═════════════╬═════════════╣
║ ss ║ Steve ║ (null) ║
╚═══════════╩═════════════╩═════════════╝
如果没有行,它应该是这样的
╔═══════════╦═════════════╦═════════════╗
║ whatever ║ NAME1 ║ NAME2 ║
╠═══════════╬═════════════╬═════════════╣
║ ss ║ (null) ║ (null) ║
╚═══════════╩═════════════╩═════════════╝
我不想让人们对我失败的疑问感到困惑,并且想到了新的开始。我尝试了多个基于行= 1或2返回val的子查询,但由于我需要传入数字而失败,并且似乎多个子查询不会接受来自外部深度超过2个级别的数字。也尝试使用枢轴,但无法理解它,我也没有聚合功能,所以不知道我怎么能在这里使用它。
答案 0 :(得分:1)
Oracle安装程序:
CREATE TABLE your_query ( id, name ) AS
SELECT 1, 'Steve' FROM DUAL UNION ALL
SELECT 1, 'Steve' FROM DUAL;
<强>查询强>:
SELECT 'ss' AS whatever,
name1,
name2
FROM (
SELECT name,
ROW_NUMBER() OVER ( ORDER BY id, name ) AS rn
FROM your_query
)
PIVOT ( MAX(name) FOR rn IN (1 AS Name1, 2 AS Name2 ) );
<强>输出强>:
WHATEVER NAME1 NAME2
-------- ----- -----
ss Steve Steve
答案 1 :(得分:-1)
对于输入始终包含两行的情况:
create table #mytable (number int, name varchar(50))
insert into #mytable values (1, 'Steve')
insert into #mytable values (2, 'John')
select
M1.number as 'whatever',
M1.name as 'Name1',
M2.name as 'Name2'
from #mytable M1
inner join #mytable M2
on M1.number < M2.number