首页 文章

显示单行oracle中多行的列

提问于
浏览
0

我有一个我的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

要求是 display a column value from two rows(or rows with same node_no) into a single row as two different columns . 必须保持订单 .

注意:这可能看起来像SQL Query to concatenate column values from multiple rows in Oracle SQL Query to concatenate column values from multiple rows in Oracle的副本

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

2 回答

  • 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 ,因此如果您想要执行除标准词典编排之外的某些自定义排序,则需要在 order by 子句中自行实现 .

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

    SELECT node_no, 
    MAX(code) as code, 
    MAX(CASE WHEN rn=1 THEN value1 END) AS value1, 
    MAX(CASE WHEN rn=2 THEN value1 END) AS value2 
    FROM cte 
    GROUP BY node_no
    
  • 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小提琴示例

    不过,我不确定这是否比现有答案更有效 .

相关问题