将 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
我在 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