34,838
社区成员




if object_id('tempdb..#list') is not null drop table #list
;
with t1 as(
select ID=1,产品编号='PN001',物料名称='螺母',物料型号='L01',数量=50 UNION ALL
select ID=2,产品编号='PN001',物料名称='螺母',物料型号='L02',数量=50 UNION ALL
select ID=3,产品编号='PN001',物料名称='螺圈',物料型号='',数量=100 UNION ALL
select ID=4,产品编号='PN002',物料名称='螺母',物料型号='L01',数量=50 UNION ALL
select ID=5,产品编号='PN002',物料名称='螺杆',物料型号='',数量=50 UNION ALL
select ID=6,产品编号='PN003',物料名称='螺母',物料型号='L02',数量=10
),t2 as(
select ID=1,产品编号='PN001',辅料名称='标签',辅料尺寸='7x5' ,数量=100 union all
select ID=2,产品编号='PN001',辅料名称='纸箱',辅料尺寸='20x20x12' ,数量=5 union all
select ID=3,产品编号='PN002',辅料名称='标签',辅料尺寸='7x5' ,数量=50 union all
select ID=4,产品编号='PN004',辅料名称='皮筋',辅料尺寸='' ,数量=50
)
select 产品编号,物料名称,数量 into #list
from t1
union all
select 产品编号,物料名称=辅料名称,数量
from t2
declare @sql nvarchar(max),@colname nvarchar(4000)=''
;
with list as(
select distinct 物料名称
from #list
)
select @colname=@colname+',['+物料名称+']'
from list
set @sql='
select *
from #list lt pivot (sum(数量) for 物料名称 in('+RIGHT(@colname,len(@colname)-1)+')) pt
'
exec(@sql)
/*
产品编号 标签 螺杆 螺母 螺圈 皮筋 纸箱
----- ----------- ----------- ----------- ----------- ----------- -----------
PN001 100 NULL 100 100 NULL 5
PN002 50 50 50 NULL NULL NULL
PN003 NULL NULL 10 NULL NULL NULL
PN004 NULL NULL NULL NULL 50 NULL
(4 行受影响)
*/
;
with t1 as(
select ID=1,产品编号='PN001',物料名称='螺母',物料型号='L01',数量=50 UNION ALL
select ID=2,产品编号='PN001',物料名称='螺母',物料型号='L02',数量=50 UNION ALL
select ID=3,产品编号='PN001',物料名称='螺圈',物料型号='',数量=100 UNION ALL
select ID=4,产品编号='PN002',物料名称='螺母',物料型号='L01',数量=50 UNION ALL
select ID=5,产品编号='PN002',物料名称='螺杆',物料型号='',数量=50 UNION ALL
select ID=6,产品编号='PN003',物料名称='螺母',物料型号='L02',数量=10
),t2 as(
select ID=1,产品编号='PN001',辅料名称='标签',辅料尺寸='7x5' ,数量=100 union all
select ID=2,产品编号='PN001',辅料名称='纸箱',辅料尺寸='20x20x12' ,数量=5 union all
select ID=3,产品编号='PN002',辅料名称='标签',辅料尺寸='7x5' ,数量=50 union all
select ID=4,产品编号='PN004',辅料名称='皮筋',辅料尺寸='' ,数量=50
),list as(
select 产品编号,物料名称,数量
from t1
union all
select 产品编号,物料名称=辅料名称,数量
from t2
)
select *
from list lt pivot (sum(数量) for 物料名称 in([螺母],[螺圈],[螺杆],[标签],[纸箱],[皮筋])) pt
/*
产品编号 螺母 螺圈 螺杆 标签 纸箱 皮筋
----- ----------- ----------- ----------- ----------- ----------- -----------
PN001 100 100 NULL 100 5 NULL
PN002 50 NULL 50 50 NULL NULL
PN003 10 NULL NULL NULL NULL NULL
PN004 NULL NULL NULL NULL NULL 50
(4 行受影响)
*/
;
with t1 as(
select ID=1,产品编号='PN001',物料名称='螺母',物料型号='L01',数量=50 UNION ALL
select ID=2,产品编号='PN001',物料名称='螺母',物料型号='L02',数量=50 UNION ALL
select ID=3,产品编号='PN001',物料名称='螺圈',物料型号='',数量=100 UNION ALL
select ID=4,产品编号='PN002',物料名称='螺母',物料型号='L01',数量=50 UNION ALL
select ID=5,产品编号='PN002',物料名称='螺杆',物料型号='',数量=50 UNION ALL
select ID=6,产品编号='PN003',物料名称='螺母',物料型号='L02',数量=10
),t2 as(
select ID=1,产品编号='PN001',辅料名称='标签',辅料尺寸='7x5' ,数量=100 union all
select ID=2,产品编号='PN001',辅料名称='纸箱',辅料尺寸='20x20x12' ,数量=5 union all
select ID=3,产品编号='PN002',辅料名称='标签',辅料尺寸='7x5' ,数量=50 union all
select ID=4,产品编号='PN004',辅料名称='皮筋',辅料尺寸='' ,数量=50
),list as(
select 产品编号,物料名称,数量
from t1
union all
select 产品编号,物料名称=辅料名称,数量
from t2
)
select *
from list lt pivot (sum(数量) for 物料名称 in([螺母],[螺圈],[螺杆],[标签],[纸箱 皮筋])) pt
/*
产品编号 螺母 螺圈 螺杆 标签 纸箱 皮筋
----- ----------- ----------- ----------- ----------- -----------
PN001 100 100 NULL 100 NULL
PN002 50 NULL 50 50 NULL
PN003 10 NULL NULL NULL NULL
PN004 NULL NULL NULL NULL NULL
(4 行受影响)
*/