我从我的一个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
但是我们将值显示为单个聚合列。
答案 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
请注意,这假设您的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
需要汇总功能,但在这种情况下,我们没有任何内容可以汇总,所以......)
我不确定这是否比现有答案更有效。