2017-05-31 27 views
0

私のアプリケーションでSQL Serverを使用しています。SQL Serverクエリに必要な結果があります

表のデータは以下の通りである:

enter image description here

そして、私はフォーマットを以下になりたい:

enter image description here

私はsplit functionで試してみましたが、そのは正常に動作しません。

このような結果を得ることは可能ですか?

お勧めします。

ありがとうございます。

+1

これはバックエンドでうまくいくと思います。 –

+0

私はバックエンド(SQL Server)でこれをやっています –

+1

私は、C#、PHPなど、またはあなたが使用している言語を意味します。 –

答えて

0

これを試してみてください。単一のNot Reqを得るためには、これはこのようなものです(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

ありがとうございます。 –

0

コメントに記載されているように、フロントエンドで行う方が簡単かもしれませんが、SQL Serverでも同様に行うことができます。

Partial Rextester Demo

私はあなたの全体のシナリオを複製するが、2列のためにそれを得ませんでした。まずそれを行うには、各行に一意の識別子が必要です。私はシーケンス番号(1,2,3 ...)を使用しています。

ここでは、再帰的サブクエリを使用してcsvを行に分割するanswerを参照してください。次に、XML PATHを使用して列をcsvに戻しました。

OLD SPCOLD FREQに対してこれを実行しているクエリです。

;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 
; 

それはあなたにこの出力あなたがしなければならない何

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

を与えるだろう、今 - 各行を一意に識別するためのシーケンス番号を生成する方法を見つけます。任意の列を使用できる場合は、SEQの代わりにその列を使用します。

  • 同様に、NEW_SPCNEW_FREQのロジックを追加します。 (ちょうどOLD_FREQに同様LEFTSTUFFを貼り付け、NEW_SPCNEW_FREQのためにそれを変更コピーします。

  • 一つだけNOT REQを取得しますので、''で複数NOT REQ/を交換してください。あなたがreplace機能でそれを行うことができます。

Rextersterデモに問題やエラーが発生した場合は、Rextersterデモに追加してURLを共有してください。

関連する問題