SQL Server查询所需的结果

时间:2017-05-31 06:29:15

标签: sql-server sql-server-2014

我在我的应用程序中使用SQL Server。

表格数据如下:

enter image description here

我希望得到以下格式的结果:

enter image description here

我尝试使用split function,但效果不正常。

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

请建议。

谢谢。

2 个答案:

答案 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添加逻辑。 (只需像LEFT中一样复制粘贴STUFFOLD_FREQ,然后将其更改为NEW_SPCNEW_FREQ

  • NOT REQ/替换为'',因此您只能获得一个NOT REQ。您可以使用replace功能执行此操作。

如果您在执行此操作时遇到任何问题/错误,请将其添加到Rexterster演示并共享该网址,我们会检查该错误。

答案 1 :(得分:0)

试试这个。我没有设法获得单一的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