【问题标题】:ORACLE : group servearesults into a single columnORACLE:将服务结果分组到一个列中
【发布时间】:2020-02-05 15:21:17
【问题描述】:

我有这张桌子

FLIGHT  N_flight  ORIGIN  DESTINATION
--------------------------------------------------
1111      1        LAX        MIA
1111      2        MIA        SCL 
1111      3        SCL        ARG
112       1        LAX        ATL
112       2        ATL        JFK
113       1        MIA        SEA
113       2        SEA        PHX
113       3        PHX        MSP
113       4        PHX        LIM

我需要按航班分组,并在另一列分组所有航班的出发地和目的地 像这样:

FLIGHT  ROUTING 
--------------------------------------------------
1111     LAX - MIA - SCL - ARG
112      LAX - ATL - JFK
113      MIA - SEA - PHX - MSP - LIM

【问题讨论】:

  • 看来你需要LISTAGG,前提是你的数据库是11g或以上。
  • 您需要澄清您的输出 - 标题中有四个列名,但只有两列值。在下面的回答中,我猜测了您的意思,但这只是猜测。
  • @mathguy 你说得对,我编辑了它

标签: sql oracle string-aggregation


【解决方案1】:

您可以在单个聚合查询中完成所有操作,如下所示:

with
  flights (flight, n_flight, origin, destination) as (
    select 1111, 1, 'LAX', 'MIA' from dual union all
    select 1111, 2, 'MIA', 'SCL' from dual union all 
    select 1111, 3, 'SCL', 'ARG' from dual union all
    select  112, 1, 'LAX', 'ATL' from dual union all
    select  112, 2, 'ATL', 'JFK' from dual union all
    select  113, 1, 'MIA', 'SEA' from dual union all
    select  113, 2, 'SEA', 'PHX' from dual union all
    select  113, 3, 'PHX', 'MSP' from dual union all
    select  113, 4, 'MSP', 'LIM' from dual
  )
select flight
     , min(origin)      keep (dense_rank first order by n_flight) as origin
     , min(destination) keep (dense_rank last  order by n_flight) as destination
     , listagg(origin, ' - ') within group (order by n_flight) || ' - ' ||
           min(destination) keep (dense_rank last  order by n_flight) as route
from   flights
group  by flight
;

    FLIGHT ORIGIN DESTINATION ROUTE                         
---------- ------ ----------- ------------------------------
       112 LAX    JFK         LAX - ATL - JFK               
       113 MIA    LIM         MIA - SEA - PHX - MSP - LIM   
      1111 LAX    ARG         LAX - MIA - SCL - ARG 

请注意,我更改了您输入数据的最后一行;我假设出发地应该是上一个航班的目的地,您没有两个不同的航段(3 和 4)来自同一个机场。

WITH 子句让许多读者感到困惑。这不是解决方案的一部分;它只是为了模拟输入。删除它,并在主查询中使用您的实际表名和列名,以 select flight... 开头

【讨论】:

    猜你喜欢
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多