SQL Server查询所需结果
我正在使用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等或您正在使用的任何语言。 –