Sql 如何连接多行中的字符串?

Sql 如何连接多行中的字符串?,sql,oracle,Sql,Oracle,我有一个包含以下列的表: 产品 年更新 示例数据: PROD1,2017 PROD1,2015 PROD2,2014 PROD3,2017 如何获取每个产品更新的时间列表?比如: PRODUCT,2017,2016,2015,2014,etc PROD1,Y,N,Y,N PROD2,N,N,N,Y PROD3,Y,N,N,N 或 甲骨文数据库 谢谢 我假设该表的名称为Products,请将其更改为表的名称 Oracle 您可以使用listag来实现它 如果您使用的是SQL Server,

我有一个包含以下列的表:

  • 产品
  • 年更新
示例数据:

PROD1,2017
PROD1,2015
PROD2,2014
PROD3,2017
如何获取每个产品更新的时间列表?比如:

PRODUCT,2017,2016,2015,2014,etc
PROD1,Y,N,Y,N
PROD2,N,N,N,Y
PROD3,Y,N,N,N

甲骨文数据库


谢谢

我假设该表的名称为
Products
,请将其更改为表的名称

Oracle

您可以使用
listag
来实现它

如果您使用的是SQL Server,则可以这样做

select p.Product + ', ' + stuff((select ', '+ cast(tp.YearUpdated as varchar(4)) from Products tp where p.Product = tp.Product
          FOR XML PATH('')) , 1, 2, '')
from Products p
group by p.Product
如果您想快速测试它,您可以尝试一下(使用内存中的表)


假设表中有id和年份列:

   select cast ( t1.id as  varchar) + ',' + ( case when  t1.rn2 = 1   then  '2015' else '' end )
+ 
   ( case when  t1.rn2 = 2  then  '2015,2016 ' else  '' end ) + 
   ( case when  t1.rn2 =  3 then  '2015,2016,2017' else '' end ) 
 from 
  (select distinct  yourTBL.id , max(yourTBL.rn)
   over ( partition by yourTBL.id order by yourTBL.year rows BETWEEN  UNBOUNDED PRECEDING 
        AND UNBOUNDED following ) as rn2
 from (select id ,  year ,  
      row_number()over (partition by id order by year) as rn from yourTBL ) t) t1

嗯,很有趣。你试过什么问题?另外,您正在使用什么RDBMS?只是想澄清一下,它在开始时是这样的:
prod12017;Prod12015;2014年4月2日等?RDBMS=Oracle;是的,数据和你的例子相符你一定是在开玩笑。为什么要硬编码字符串?如果表中有2000条记录,年份从1950年到1999年,该怎么办?此外,表中没有Id,问题是清楚地说明表中的列(产品和年份更新)。
select p.Product + ', ' + stuff((select ', '+ cast(tp.YearUpdated as varchar(4)) from Products tp where p.Product = tp.Product
          FOR XML PATH('')) , 1, 2, '')
from Products p
group by p.Product
declare @Products table (Product varchar(50), YearUpdated int);

insert into @Products values ('Product 1', 2000);
insert into @Products values ('Product 1', 2001);
insert into @Products values ('Product 1', 2002);
insert into @Products values ('Product 1', 2003);
insert into @Products values ('Product 2', 2010);
insert into @Products values ('Product 2', 2011);
insert into @Products values ('Product 4', 2012);
insert into @Products values ('Product 4', 2013);
insert into @Products values ('Product 4', 2015);
insert into @Products values ('Product 3', 2005);

select p.Product + ', ' + stuff((select ', '+ cast(tp.YearUpdated as varchar(4)) from @Products tp where p.Product = tp.Product
          FOR XML PATH('')) , 1, 2, '')
from @Products p
group by p.Product
   select cast ( t1.id as  varchar) + ',' + ( case when  t1.rn2 = 1   then  '2015' else '' end )
+ 
   ( case when  t1.rn2 = 2  then  '2015,2016 ' else  '' end ) + 
   ( case when  t1.rn2 =  3 then  '2015,2016,2017' else '' end ) 
 from 
  (select distinct  yourTBL.id , max(yourTBL.rn)
   over ( partition by yourTBL.id order by yourTBL.year rows BETWEEN  UNBOUNDED PRECEDING 
        AND UNBOUNDED following ) as rn2
 from (select id ,  year ,  
      row_number()over (partition by id order by year) as rn from yourTBL ) t) t1