2017-03-27 12 views
3

私は、次の列を持つテーブルがある:複数の行から文字列を連結する方法は?

  • 製品
  • YEAR_UPDATED

例データ:

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 

または

PROD1,2017,2015 
PROD2,2014 
PROD3,2017 

のOracle DB

ありがとう!

+1

うーん、興味深いです。どのようなクエリを試しましたか?また、どのRDBMSを使用していますか? –

+0

ちょうど明確にするために、これは最初のように見えるでしょうか?Prod1、2017; Prod1,2015; Prod2、2014;など? –

+0

RDBMS = Oracle。はい、データがあなたの例に一致します – ConsultUtah

答えて

3

テーブルの名前がProductsであると仮定していますが、テーブルの名前が何であれ、それを変更してください。

オラクル

あなたはLISTAGGfunctionを使用してそれを達成。

select p.Product || ', ' || listagg(p.YEARUPDATED,',') within group (order by p.YEARUPDATED) 
from Products p 
group by p.Product; 

あなたは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と今年の列を持っていると仮定すると
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 
1

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 
+0

あなたは私たちを冗談にする必要があります。なぜあなたは文字列をハードコーディングしていますか?テーブルに1950年から1999年までの年の2000レコードがある場合はどうなりますか?また、テーブルにはIDはありませんが、テーブルのカラム(PRODUCTとYEAR_UPDATED)を明示しているかどうかは疑問です。 – ahoxha

関連する問題