--> 测试数据: #T
if object_id('tempdb.dbo.#T') is not null drop table #T
create table #T (ID varchar(4),PR varchar(4),Material varchar(2),Panel varchar(10),QTY int,Serial varchar(50),PanelNo varchar(50))
insert into #T
select 'S001','P001','M1','H1,H2,H3',3,null,null union all
select 'S002','P002','M3','AH2,AH5',4,null,null union all
select 'S003','P001','M6','P01,P03',2,null,null union all
select 'S004','P002','M5','AH3',1,null,null union all
select 'S005','P006','M8','PA1,PA2',2,null,null
;
with
T (ID,P1,P2) as
(
select ID,charindex(',',','+Panel),charindex(',',Panel+',')+1 from #T where len(Panel)-len(replace(Panel,',',''))+1=Qty
union all
select a.ID,b.P2,charindex(',',Panel+',',b.P2)+1 from #T a join T b on a.ID=b.ID where charindex(',',Panel+',',b.P2) > 0
),
P as
(
select a.ID,Panel=substring(a.Panel+',',b.P1,b.P2-b.P1-1),Qty=1 from #T a join T b on a.ID=b.ID
)
select
a.ID,
a.PR,
a.Material,
a.Panel,
Qty=isnull(b.QTY,a.Qty),
Serial=isnull(a.PR+'-'+a.Material+'-'+b.Panel,''),
PanelNo=isnull(b.Panel,'')
from
#T a left join P b on a.ID=b.ID
/*
ID PR Material Panel QTY Serial PanelNo
S001 P001 M1 H1,H2,H3 1 P001-M1-H1 H1
S001 P001 M1 H1,H2,H3 1 P001-M1-H2 H2
S001 P001 M1 H1,H2,H3 1 P001-M1-H3 H3
S002 P002 M3 AH2,AH5 4
S003 P001 M6 P01,P03 1 P001-M6-P01 P01
S003 P001 M6 P01,P03 1 P001-M6-P03 P03
S004 P002 M5 AH3 1 P002-M5-AH3 AH3
S005 P006 M8 PA1,PA2 1 P006-M8-PA1 PA1
S005 P006 M8 PA1,PA2 1 P006-M8-PA2 PA2
*/