Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle用逗号连接列_Sql_Database_Oracle_Concatenation_String Aggregation - Fatal编程技术网

Sql Oracle用逗号连接列

Sql Oracle用逗号连接列,sql,database,oracle,concatenation,string-aggregation,Sql,Database,Oracle,Concatenation,String Aggregation,可能重复: 有人能告诉我如何做到以下几点吗 表: efforts_id cycle_name release_name 123 quarter march 123 half april 123 full april 124 quarter may 我的预期产出: efforts

可能重复:

有人能告诉我如何做到以下几点吗

表:

efforts_id        cycle_name      release_name 
123               quarter         march 
123               half            april 
123               full            april
124               quarter         may
我的预期产出:

efforts_id        cycle_name            release_name 
123               quarter,half,full     march,april
124               quarter               may
我是甲骨文的初学者,所以不知道怎么做。任何帮助都将不胜感激

通过函数感谢(当然还有分组方式)

嗯,刚刚发现这个:

请注意,WM_CONCAT没有文档记录,Oracle不支持它,这意味着不应在生产系统中使用它 Oracle记录并支持可产生与WM_CONCAT相同输出的函数

您需要的是“字符串聚合”。Tim Hall的优秀网站根据您拥有的Oracle的确切版本显示了您的备选方案:

在11gR2(撰写本文时的当前版本)中,应使用listagg函数:

select
  efforts_id,
  listagg(cycle_name, ',') within group (order by cycle_name) as cycle_name,
  listagg(release_name, ',') within group (order by release_name) as release_name
from my_table
group by efforts_id;

请注意,Oracle不支持使用wm_concat函数…

如果您有Oracle 11g R2,则最好使用Listag:

SELECT efforts_id,
    LISTAGG(cycle_name) WITHIN GROUP(ORDER BY cycle_name),
    LISTAGG(release_name) WITHIN GROUP(ORDER BY cycle_name)
FROM MY_TABLE
GROUP BY efforts_id
如果没有,则显示执行此任务的其他方法。

您将希望使用来执行此任务。其他答案不会删除任何重复的值,要删除重复的值,可以使用类似的方法:

select c.efforts_id, 
  c.cycle_name,
  listagg(r.release_name, ', ') within group (order by c.efforts_id) as release_name
from
(
  select efforts_id,
    listagg(cycle_name, ', ') within group (order by efforts_id) as cycle_name
  from yourtable
  group by efforts_id
) c
inner join
(
  select distinct efforts_id, release_name
  from yourtable
) r
  on c.efforts_id = r.efforts_id
group by c.efforts_id, c.cycle_name

请参见

+1,记住listagg受4000字节的限制。因为它是一个varchar,而不是clob。有传言说,在Oracle 12c中(预计在今年年底),数据库中的varchar数将达到32767,就像在PL/SQL中一样…@ErkanHaspulat 4000 char,当然?!非常感谢。只有一个问题。。输出是这样的。123版本的名称是三月、四月、四月。。。如何避免重复数据?您可以在聚合数据之前对数据进行
distinct
。您可能需要一个子查询或with子句。@Jeevan不客气,您可能可以使用
with
子句而不是子select(以您的首选项为准)来稍微清理一下。嗯,好的。。我不知道该怎么做。(我是甲骨文的新手..全新:)。我现在就同意你的回答。需要帮助请。。我想在cycle\u name和release\u name列上删除重复项。。我尝试了几件事,但似乎不起作用。请help@Jeevan请检查这个演示--
select c.efforts_id, 
  c.cycle_name,
  listagg(r.release_name, ', ') within group (order by c.efforts_id) as release_name
from
(
  select efforts_id,
    listagg(cycle_name, ', ') within group (order by efforts_id) as cycle_name
  from yourtable
  group by efforts_id
) c
inner join
(
  select distinct efforts_id, release_name
  from yourtable
) r
  on c.efforts_id = r.efforts_id
group by c.efforts_id, c.cycle_name