2017-03-27 3 views
3

Ich habe eine Tabelle mit den folgenden Spalten:Wie verketten Sie Zeichenfolgen aus mehreren Zeilen?

  • PRODUKT
  • YEAR_UPDATED

Beispieldaten:

PROD1,2017 
PROD1,2015 
PROD2,2014 
PROD3,2017 

Wie kann ich eine Liste, wenn jedes Produkt aktualisiert wurde erhalten ? Etwas wie:

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

oder

PROD1,2017,2015 
PROD2,2014 
PROD3,2017 

Oracle DB

Dank!

+1

Hmm, interessant. Welche Abfrage hast du versucht? Welche RDBMS verwenden Sie auch? –

+0

Nur um klarzustellen, sieht es am Anfang so aus: 'Prod1, 2017; Prod1, 2015; Prod2, 2014; 'usw.? –

+0

RDBMS = Oracle; Ja, die Daten entsprechen Ihrem Beispiel – ConsultUtah

Antwort

3

Ich gehe davon aus, dass der Name der Tabelle Products lautet, ändern Sie sie in den Namen Ihrer Tabelle.

Oracle

Sie es erreichen, indem die LISTAGGfunction verwenden.

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

Wenn Sie SQL Server verwenden, das ist, wie Sie es tun können.

Wenn Sie es schnell testen möchten, können Sie dies ausprobieren (mit einer In-Memory-Tabelle).

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

Sie haben id und Jahr Spalten in der Tabelle Angenommen:

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

Sie müssen uns verarschen. Warum codierst du die Schnur hart? Was ist, wenn die Tabelle 2000 Datensätze mit Jahren ab 1950 bis 1999 hat? Auch keine ID in der Tabelle, die Frage gibt eindeutig die Spalten der Tabelle (PRODUCT und YEAR_UPDATED). – ahoxha

Verwandte Themen