我正在使用SQL Server和我的應用程序。SQL Server查詢所需結果
表數據如下:
而且我想導致以下格式:
我試圖與split function
但它不能正常工作。
是否有可能得到這樣的結果。
請建議。
謝謝。
我正在使用SQL Server和我的應用程序。SQL Server查詢所需結果
表數據如下:
而且我想導致以下格式:
我試圖與split function
但它不能正常工作。
是否有可能得到這樣的結果。
請建議。
謝謝。
試試這個。 e得到一個單獨的非需求,就像這樣(「不需要/不需要」)。
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 ...)。
現在請參閱answer,它使用遞歸子查詢將csv拆分爲行。然後我使用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
添加邏輯。 (只是複製粘貼LEFT
和STUFF
像OLD_FREQ
並改變它NEW_SPC
和NEW_FREQ
。
與''
替換多個NOT REQ/
,所以你只能得到一個NOT REQ
,你可以用replace
功能做到這一點。
如果您在這樣做時遇到任何問題/錯誤,請將其添加到Rexterster Demo並分享網址,我們會檢查該網址。
我認爲這會在後端更好地完成。 –
我在後端執行此操作(SQL Server) –
我的意思是,C#,PHP等或您正在使用的任何語言。 –