SQL Server查询所需结果

问题描述:

我正在使用SQL Server和我的应用程序。SQL Server查询所需结果

表数据如下:

enter image description here

而且我想导致以下格式:

enter image description here

我试图与split function但它不能正常工作。

是否有可能得到这样的结果。

请建议。

谢谢。

+1

我认为这会在后端更好地完成。 –

+0

我在后端执行此操作(SQL Server) –

+1

我的意思是,C#,PHP等或您正在使用的任何语言。 –

试试这个。 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 
+0

谢谢你的工作 –

正如评论中提到的那样,您可能会更容易在前端执行此操作,但也可以在SQL Server中完成。

Partial Rextester Demo

我没有复制你的整个方案,但有它的2列。首先要做到这一点,你需要每行的唯一标识符。我正在使用序列号(1,2,3 ...)。

现在请参阅answer,它使用递归子查询将csv拆分为行。然后我使用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添加逻辑。 (只是复制粘贴LEFTSTUFFOLD_FREQ并改变它NEW_SPCNEW_FREQ

  • ''替换多个NOT REQ/,所以你只能得到一个NOT REQ,你可以用replace功能做到这一点。

如果您在这样做时遇到任何问题/错误,请将其添加到Rexterster Demo并分享网址,我们会检查该网址。