2017-05-31 108 views
0

我正在使用SQL Server和我的應用程序。SQL Server查詢所需結果

表數據如下:

enter image description here

而且我想導致以下格式:

enter image description here

我試圖與split function但它不能正常工作。

是否有可能得到這樣的結果。

請建議。

謝謝。

+1

我認爲這會在後端更好地完成。 –

+0

我在後端執行此操作(SQL Server) –

+1

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

回答

0

試試這個。 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

謝謝你的工作 –

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並分享網址,我們會檢查該網址。