【问题标题】:Concatenate across columns and rows using group and listagg in Oracle SQL在 Oracle SQL 中使用 group 和 listagg 跨列和行连接
【发布时间】:2020-01-08 06:15:00
【问题描述】:

我有一个像下面这样的表格,想先按列分组,然后按行分组。 我有一个解决方案,有点工作,但很慢。有没有更有效的方法呢?

谢谢

| GROUP | VAL 1 | VAL 2 | VAL 3 | 
|   A   |   1   |    2  |   3   |
|   A   |   4   |   5   |  6    | 
|   B   |   7   |   8   |   9   |
|   C   |   10  |   11  |   12  |

首选结果是

| GROUP | TEXT |
|   A   |123456|
|   B   | 789  |
|   C   |101112|

这是我目前拥有的,但速度很慢。是否有跨列和行分组的替代解决方案

    select GROUP,
    listagg(comments,',')
    within GROUP (order by GROUP) "TEXT"
    from
    (select concat(val 1,concat(val 2,val 3)) as Comments, data.* 
    from data)
    group by GROUP;

谢谢

【问题讨论】:

    标签: sql oracle listagg


    【解决方案1】:

    使用以下查询,您将直接获得连接的列值:

    SELECT
        "GROUP",
        LISTAGG(VAL_1 || VAL_2 || VAL_3)  
            WITHIN GROUP(ORDER BY VAL_1) AS "TEXT"
    FROM DATA
    GROUP BY "GROUP";
    

    注意:请勿使用 oracle 保留关键字作为列名。这里GROUP是oracle的保留关键字。

    干杯!!

    【讨论】:

    • @glencloncurry 。 . .尽管此查询绝对是您的查询的简化,但它应该具有与您的查询相同的性能。我理解这个问题是想要提高性能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    • 2021-01-29
    • 2021-07-25
    相关资源
    最近更新 更多