如何将这两行显示为一行

时间:2017-03-16 17:17:04

标签: sql oracle

我正在使用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个级别的数字。也尝试使用枢轴,但无法理解它,我也没有聚合功能,所以不知道我怎么能在这里使用它。

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