2017-05-31 3 views
0

Ich verwende SQL Server mit meiner Anwendung.SQL Server-Abfrage für das erforderliche Ergebnis

Die Tabellendaten ist wie folgt:

enter image description here

Und ich in folgendem Format führen wollen:

enter image description here

ich mit split function versucht haben, aber es ist nicht richtig funktioniert.

Ist es möglich, ein solches Ergebnis zu erhalten.

Bitte vorschlagen.

Vielen Dank.

+1

ich denke, das wird besser in Ihrem Backend getan werden. –

+0

Ich mache das im Backend (SQL Server) –

+1

ich meine, C#, PHP usw. oder welche Sprache Sie verwenden. –

Antwort

0

Versuchen Sie das. Ich habe nicht verwaltet Um eine einzige Not Req zu bekommen, ist es so ("Not Req/Not Req").

drop table if exists dbo.TableB; 

create table dbo.TableB (
OldSPC varchar(100) 
, old_freq varchar(100) 
, NewSPC varchar(100) 
, new_freq varchar(100) 

);

insert into dbo.TableB(OldSPC, old_freq, NewSPC, new_freq) 
values ('ADH,BAP', '7,7', 'ADH,BAP', '7,7') 
, ('Not Req', 'Not Req', 'ADH,BAP', '7,7') 
, ('BAP,EXT,ADL', '35,7,42', 'BAP,EXT,BAP,ADL', '21,7,35,42'); 

select 
tt1.OldSPCOldFreq 
, tt2.NewSPCNewFreq 
from (
    select 
     t.OldSPC, t.old_freq, t.NewSPC, t.new_freq 
     , STRING_AGG(t1.value + '/' + t2.value, ',') OldSPCOldFreq 
    from dbo.TableB t 
     cross apply (
      select 
       ROW_NUMBER() over (order by t.OldSPC) as Rbr 
       , ss.value 
      from string_split (t.OldSPC, ',') ss 
     ) t1 
     cross apply (
      select 
       ROW_NUMBER() over (order by t.old_freq) as Rbr 
       , ss.value 
      from string_split (t.old_freq, ',') ss 
     ) t2 
    where t1.Rbr = t2.Rbr 
    group by t.OldSPC, t.old_freq, t.NewSPC, t.new_freq 
) tt1 
inner join (
    select 
     t.OldSPC, t.old_freq, t.NewSPC, t.new_freq 
     , STRING_AGG(t3.value + '/' + t4.value, ',') NewSPCNewFreq 
    from dbo.TableB t 
     cross apply (
      select 
       ROW_NUMBER() over (order by t.NewSPC) as Rbr 
       , ss.value 
      from string_split (t.NewSPC, ',') ss 
     ) t3 
     cross apply (
      select 
       ROW_NUMBER() over (order by t.new_freq) as Rbr 
       , ss.value 
      from string_split (t.new_freq, ',') ss 
     ) t4 
    where t3.Rbr = t4.Rbr 
    group by t.OldSPC, t.old_freq, t.NewSPC, t.new_freq 
) tt2 on tt1.OldSPC = tt2.OldSPC 
and tt1.old_freq = tt2.old_freq 
and tt1.NewSPC = tt2.NewSPC 
and tt1.new_freq = tt2.new_freq 
+0

Danke..es funktioniert –

0

Wie in den Kommentaren erwähnt, könnte es für Sie einfacher sein, es am Frontend zu tun, aber es könnte auch in SQL Server getan werden.

Partial Rextester Demo

Ich habe Ihr ganzes Szenario nicht replizieren, sondern hätte es für 2 Spalten. Um dies zu tun, benötigen Sie für jede Zeile eine eindeutige Kennung. Ich verwende eine Sequenznummer (1,2,3 ...).

Jetzt beziehen Sie sich auf answer, die rekursive Unterabfrage verwendet, um csv in Zeilen zu teilen. Dann habe ich XML PATH verwendet, um die Spalten zurück in CSV zu ändern.

Dies ist die Abfrage, die es für OLD SPC und OLD FREQ tut.

;with tmp(SEQ,OldSPCItem,OldSPC,OLD_FREQ_item,OLD_FREQ) as (
select SEQ, LEFT(OldSPC, CHARINDEX(',',OldSPC+',')-1), 
    STUFF(OldSPC, 1, CHARINDEX(',',OldSPC+','), ''), 

    LEFT(OLD_FREQ, CHARINDEX(',',OLD_FREQ+',')-1), 
    STUFF(OLD_FREQ, 1, CHARINDEX(',',OLD_FREQ+','), '') 
from table1 
union all 
select SEQ, LEFT(OldSPC, CHARINDEX(',',OldSPC+',')-1), 
    STUFF(OldSPC, 1, CHARINDEX(',',OldSPC+','), ''), 
     LEFT(OLD_FREQ, CHARINDEX(',',OLD_FREQ+',')-1), 
    STUFF(OLD_FREQ, 1, CHARINDEX(',',OLD_FREQ+','), '') 
from tmp 
where OldSPC > '' 
) 
select seq,STUFF((SELECT ',' + CONCAT(OldSPCItem,'/',OLD_FREQ_item) FROM TMP I 
WHERE I.seq = O.seq FOR XML PATH('')),1,1,'') OLD_SPC_OLD_FREQ 
from tmp O 
GROUP BY seq 
; 

Es wird Ihnen diese Ausgabe

+-----+------------------+ 
| seq | OLD_SPC_OLD_FREQ | 
+-----+------------------+ 
| 1 | ADH/7,BAP/9  | 
| 2 | NOT REQ/NOT REQ | 
+-----+------------------+ 

Was müssen Sie tun jetzt - Finden Sie eine Möglichkeit, eine Sequenznummer zu erzeugen, um jede Zeile eindeutig zu identifizieren. Wenn Sie eine Spalte verwenden können, verwenden Sie diese anstelle von SEQ.

  • hinzufügen In ähnlicher Logik für NEW_SPC und NEW_FREQ. (Kopieren Sie einfach einfügen LEFT und STUFF wie in OLD_FREQ und es für NEW_SPC und NEW_FREQ ändern.

  • mehr NOT REQ/ mit '' ersetzen, so dass Sie nur einem NOT REQ bekommen. Sie tun es mit replace Funktion.

Wenn Sie dabei auf ein Problem/Fehler stoßen, fügen Sie es der Rexterster Demo hinzu und teilen Sie die URL, wir werden das überprüfen.

Verwandte Themen