将 SQL 行组合成一行 (Oracle)

Combining SQL rows in just one row (Oracle)

我在 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 使用了两列,结果不止一行。

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

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

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

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

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

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

试试这个。不过我不能相信,我是在这里找到的: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