将数据拆分为多行

问题描述 投票:0回答:1
单位编号 数量
#201-12/14 1
#101-34至37 2
#01-112、#01-K106 和#01-113/114 4

输出:

单位编号 数量
#201-12 1
#201-13 1
#201-14 1
#101-34 2
#101-35 2
#101-36 2
#101-37 2
#01-112 4
#01-K106 4
#01-113 4
#01-114 4

我使用了

string_split
功能,但没有用。

在SQL Server中,我想将#101-33等数据拆分为37

所以我的输出将是

#101-33
#101-34
#101-35
#101-36
#101-37
sql sql-server
1个回答
1
投票

假设您使用的是 sql server 2022 或 Azure,这将适用于您的示例数据。有多种方法可以使其在旧版本的 sql server 上工作,但提出解决方案会遇到更多障碍,因为 string_split 不会返回序数位置,并且generate_series 直到 2022 年才存在。这是非常脆弱和非常可能会损坏,因为我猜测您的源数据只是自由文本。

话虽这么说,这将与您的示例数据一起产生您想要的输出。

create table #Something
(
    Unitnumber varchar(50)
    , Number int
)
insert #Something values
('#201-12/14', 1)
, ('#101-34to 37', 2)
;

with parsedValues as
(
    select *
    from #Something s
    cross apply string_split(s.Unitnumber, '-', 1) x
)
, prefix as
(
    select Unitnumber = pv.Unitnumber 
        , prefix = pv.value
    from parsedValues pv
    where pv.ordinal = 1
)
, rangeEndPoints as
(
    select pv.Unitnumber
        , SeriesStart = min(x.value)
        , SeriesEnd = max(x.value)
    from parsedValues pv
    cross apply string_split(replace(pv.value, 'to ', '/'), '/', 1) x --this changes the delimiter "to" into "/" so they are all the same delimiter
    where pv.ordinal = 2
    group by pv.Unitnumber
)

select pv.value + '-' + convert(varchar(10), x.value)
    , pv.Number
from prefix p 
join rangeEndPoints rep on rep.Unitnumber = p.Unitnumber
cross apply generate_series(try_convert(int, rep.SeriesStart), try_convert(int, rep.SeriesEnd), 1) x
join parsedValues pv on pv.Unitnumber = p.Unitnumber and pv.ordinal = 1
order by pv.Unitnumber
    , x.value

drop table #Something
© www.soinside.com 2019 - 2024. All rights reserved.