gpt4 book ai didi

sql - Oracle SQL有条件将行聚合到列listagg中

转载 作者:行者123 更新时间:2023-12-02 08:15:01 24 4
gpt4 key购买 nike

我有以下-简化-表格布局:

  • TABLE块(id)
  • 表内容(id,blockId,顺序,数据,类型)
  • content.blockIdblocks.id的外键。这个想法是,在内容表中,一个块有许多不同类型的内容条目。

    我现在正在寻找一个查询,该查询可以为我提供基于blockId的聚合,其中将3种不同类型的所有内容条目连接在一起并放入相应的列中。

    我已经开始并且发现运作良好的 listagg函数,我做了以下声明,并在列中列出了所有内容条目:
    SELECT listagg(c.data, ',') WITHIN GROUP (ORDER BY c.order) FROM content c WHERE c.blockId = 330;

    现在,连接的字符串在一列中包含了该块的所有 data元素。我想要实现的是根据类型将其放入单独的列中。例如, content的以下内容将是这样的:
  • 1,1,0,“content1”,“FRAGMENT”
  • 2、1、1,“content2”,“BULK”
  • 3,1,3,“content4”,“FRAGMENT”
  • 4,1,2,“content3”,“FRAGMENT”

  • 现在我想获得2列作为输出,一列是FRAGMENT,一列是BULK,其中FRAGMENT包含“content1; content3; content4”,而BULK包含“content2”

    是否有一种有效的方法来实现这一目标?

    最佳答案

    您可以使用case:

    SELECT listagg(CASE WHEN content = 'FRAGMENT' THEN c.data END, ',') WITHIN GROUP (ORDER BY c.order) as fragments,
    listagg(CASE WHEN content = 'BULK' THEN c.data END, ',') WITHIN GROUP (ORDER BY c.order) as bulks
    FROM content c
    WHERE c.blockId = 330;

    关于sql - Oracle SQL有条件将行聚合到列listagg中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42833713/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com