【问题标题】:Combining SQL rows in just one row (Oracle) [duplicate]仅在一行中组合 SQL 行(Oracle)[重复]
【发布时间】:2018-01-27 06:03:02
【问题描述】:

我在 PL/SQL Developer 上使用 Oracle 数据库,我想将查询的结果行合并到一行中。

我有这个:

   Column 1
1. Row 1
2. Row 2
3. Row 3

我想要这个:

   Column 1
1. Row 1, Row 2, Row 3

我的查询:

SELECT DISTINCT produto.ds_produto || ' Lote ->' || itmvto_estoque.cd_lote || 'Validade ->' || itmvto_estoque.dt_validade
FROM  itmvto_estoque, mvto_estoque, produto, atendime
WHERE itmvto_estoque.cd_mvto_estoque = mvto_estoque.cd_mvto_estoque
AND   produto.cd_produto = itmvto_estoque.cd_produto
AND   mvto_estoque.cd_atendimento = 1532174
AND   produto.cd_especie = 1

数据库版本为10。

我在这里 (like this one) 发现了一些类似的问题,但它们都有点不同,因为我只需要在一列中完成。

编辑:例如答案here 使用了两列,结果不止一行。

【问题讨论】:

  • 您应该尝试使您的示例查询与您的示例数据相关。您发布的查询读起来很痛苦。
  • 不完全是,该示例使用了两列并导致多于一行的分组依据。我需要一列一行。

标签: sql oracle oracle10g


【解决方案1】:

如果您至少没有 Oracle 11,您将无法使用LISTAGG。因此,一种替代方法是使用XMLAGG,如下所示:

select 
rtrim(xmlagg(xmlelement(e, column1, ', ')).extract('//text()').getclobval(), ',')
from your_table

请注意,如果需要某种形式的分组依据,这可能不起作用,但它会帮助您入门。

【讨论】:

  • 谢谢。我不使用 group by,但是我没有得到任何结果:SELECT DISTINCT rtrim(xmlagg(xmlelement(e, produto.ds_produto || ' Lote ->' || itmvto_estoque.cd_lote || 'Validade ->' || itmvto_estoque.dt_validade, ', ')).extract('//text()').getclobval(), ',') FROM itmvto_estoque, mvto_estoque, produto, atendime
  • 如果您不提供表结构,我将无法在该查询上为您提供帮助。
【解决方案2】:

您可能知道,PL /SQL 中的 PIVOT 函数直到 Oracle 11g 才出现。

以下文章提供了一些比我更简洁的选项。

http://oraclecoder.com/tutorials/three-ways-to-transpose-rows-into-columns-in-oracle-sql--160

【讨论】:

    【解决方案3】:

    试试这个。不过我不能相信,我在这里找到了它:https://dba.stackexchange.com/questions/171997/how-to-obtain-the-functionality-of-listagg-function-in-oracle-10g

    SQL> with tbl(col1) as (
         select 'Row 1' from dual union all
         select 'Row 2' from dual union all
         select 'Row 3' from dual
       )
       SELECT SUBSTR(SYS_CONNECT_BY_PATH (col1, ', '), 3) col1
             FROM (SELECT col1 , ROW_NUMBER () OVER (ORDER BY col1 ) rn,
                          COUNT (*) OVER () cnt
                     FROM tbl)
            WHERE rn = cnt
       START WITH rn = 1
       CONNECT BY rn = PRIOR rn + 1;
    
    COL1
    ----------------------------------------------------------------------
    Row 1, Row 2, Row 3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-10
      • 1970-01-01
      • 1970-01-01
      • 2021-03-26
      相关资源
      最近更新 更多