【问题标题】:How to get a similar value in Oracle如何在 Oracle 中获得类似的值
【发布时间】:2019-03-24 07:05:24
【问题描述】:

我有一个两列的表格

Col1  Col2
A        1
A        2
A        3
B        1
B        2
B        3

我需要的输出是这样的

Col1    Col2
A       1
A       1,2
A       1,2,3
B       1
B       1,2
B       1,2,3

提前谢谢你。

【问题讨论】:

  • 您实际使用的是哪个数据库,MySQL 还是 Oracle?它们不是一回事。
  • @TimBiegeleisen 用于学习目的。我需要知道两者,但主要是在 oracle 中。

标签: mysql oracle


【解决方案1】:

这是一个适用于 MySQL 的解决方案。它使用 select 子句中的相关子查询将 Col2 值组合在一起。逻辑是,对于共享相同Col1 值的给定记录组,我们只聚合小于或等于当前行的值。

SELECT
    Col1,
    (SELECT GROUP_CONCAT(t2.Col2 ORDER BY t2.Col2) FROM yourTable t2
     WHERE t2.Col2 <= t1.Col2 AND t1.Col1 = t2.Col1) Col2
FROM yourTable t1
ORDER BY
    t1.Col1,
    t1.Col2;

Demo

这是 Oracle 中的相同查询:

SELECT
    Col1,
    (SELECT LISTAGG(t2.Col2, ',') WITHIN GROUP (ORDER BY t2.Col2) FROM yourTable t2
     WHERE t2.Col2 <= t1.Col2 AND t1.Col1 = t2.Col1) Col2
FROM yourTable t1
ORDER BY
    t1.Col1,
    t1.Col2;

Demo

请注意,唯一真正的变化是将LISTAGG 替换为GROUP_CONCAT

【讨论】:

    【解决方案2】:
    with s (Col1, Col2) as (
    select 'A', 1 from dual union all
    select 'A', 2 from dual union all
    select 'A', 3 from dual union all
    select 'B', 1 from dual union all
    select 'B', 2 from dual union all
    select 'B', 3 from dual)
    select col1, ltrim(sys_connect_by_path(col2, ','), ',') path
    from s
    start with col2 = 1
    connect by prior col2 = col2 - 1 and prior col1 = col1;
    
    C PATH
    - ----------
    A 1
    A 1,2
    A 1,2,3
    B 1
    B 1,2
    B 1,2,3
    
    6 rows selected.
    

    【讨论】:

      猜你喜欢
      • 2016-04-18
      • 1970-01-01
      • 2022-01-11
      • 2016-12-11
      • 2011-07-15
      • 1970-01-01
      • 2011-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多