私のアプリケーションでSQL Serverを使用しています。SQL Serverクエリに必要な結果があります
表のデータは以下の通りである:
そして、私はフォーマットを以下になりたい:
私はsplit function
で試してみましたが、そのは正常に動作しません。
このような結果を得ることは可能ですか?
お勧めします。
ありがとうございます。
私のアプリケーションでSQL Serverを使用しています。SQL Serverクエリに必要な結果があります
表のデータは以下の通りである:
そして、私はフォーマットを以下になりたい:
私はsplit function
で試してみましたが、そのは正常に動作しません。
このような結果を得ることは可能ですか?
お勧めします。
ありがとうございます。
これを試してみてください。単一の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
ありがとうございます。 –
コメントに記載されているように、フロントエンドで行う方が簡単かもしれませんが、SQL Serverでも同様に行うことができます。
私はあなたの全体のシナリオを複製するが、2列のためにそれを得ませんでした。まずそれを行うには、各行に一意の識別子が必要です。私はシーケンス番号(1,2,3 ...)を使用しています。
ここでは、再帰的サブクエリを使用してcsvを行に分割するanswerを参照してください。次に、XML PATH
を使用して列をcsvに戻しました。
OLD SPC
とOLD 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_SPC
とNEW_FREQ
のロジックを追加します。 (ちょうどOLD_FREQ
に同様LEFT
とSTUFF
を貼り付け、NEW_SPC
とNEW_FREQ
のためにそれを変更コピーします。
一つだけNOT REQ
を取得しますので、''
で複数NOT REQ/
を交換してください。あなたがreplace
機能でそれを行うことができます。
Rextersterデモに問題やエラーが発生した場合は、Rextersterデモに追加してURLを共有してください。
これはバックエンドでうまくいくと思います。 –
私はバックエンド(SQL Server)でこれをやっています –
私は、C#、PHPなど、またはあなたが使用している言語を意味します。 –