显示单行oracle中多行的列

时间:2014-07-21 08:07:29

标签: sql oracle

我从我的一个sql返回的数据如

node_no  code  value1  order
100       AB     001     1
100       AB     007     2
101       AB     010     3

我必须使用sql进一步处理这些数据,以获得类似

的输出
node_no   code  value1  value2
100        AB     001     007
101        AB     010     null

要求将两行(或具有相同node_no的行)的列值显示为一行作为两个不同的列。 必须保持订单。

注意:这可能看似重复 SQL Query to concatenate column values from multiple rows in Oracle SQL Query to concatenate column values from multiple rows in Oracle

但是我们将值显示为单个聚合列。

2 个答案:

答案 0 :(得分:0)

试试这个:

with cte as 
(select node_no, code, value1,
row_number() over (partition by node_no order by order) rn
from tbl)

select a.node_no, a.code, a.value1 x, b.value1 value2 
from
cte a
left join cte b on a.node_no = b.node_no
and b.rn = 2
and a.rn = 1
where a.rn = 1

SQLFiddle

请注意,这假设您的value1字段为varchar2,因此,如果您要进行标准词典编排以外的自定义排序,则需要在{{1}中自行实现条款。

@MatBailie在评论中提出的另一个解决方案消除了对连接的需要(仍然需要CTE):

order by

答案 1 :(得分:0)

最新版本的Oracle也支持PIVOT子句。但是,您仍然需要获得一个常量列标识符:

SELECT node_no, code, value1, 
         ROW_NUMBER() OVER(PARTITION BY node_no ORDER BY ordering) rn
 FROM <table_name_here>) 

(我将order重命名为ordering,因为前者是保留字,需要转义/应尽可能避免)

...将像@ Shree的回答一样,根据节点对所有行进行编号。这意味着我们每个部分都有一个恒定值:

node_no   code   value1  order  rn
100       AB     001     1      1
100       AB     007     2      2
101       AB     010     3      1

此时,它变成标准的PIVOT查询:

SELECT node_no, code, value1, value2
FROM (SELECT node_no, code, value1, 
             ROW_NUMBER() OVER(PARTITION BY node_no ORDER BY ordering) rn
      FROM Pivot_Example) Indexed
PIVOT (MAX(value1) FOR (rn) IN (1 AS value1, 2 AS value2))
ORDER BY node_no

PIVOT需要汇总功能,但在这种情况下,我们没有任何内容可以汇总,所以......)

SQL Fiddle Example

我不确定这是否比现有答案更有效。