22,210
社区成员
发帖
与我相关
我的任务
分享
CREATE TABLE #ProductRelationAttr
(
id int identity primary key ,
productid int ,
attrid int,
attrvalueid int,
sku varchar(20)
)
--测试数据
INSERT INTO #ProductRelationAttr
SELECT 10001, 1, 4 , 'EP001X' UNION
SELECT 10001, 1, 5 , 'EP002X' UNION
SELECT 10001, 2, 2 , 'EP001X' UNION
SELECT 10001, 2, 3 , 'EP002X' UNION
SELECT 10002, 1, 4 , 'EP003X'
select row_number() over(order by p1.id) id ,p1.productid ,p1.attrid attrid1
,p2.attrid attrid2 ,p1.attrvalueid attrvalueid1 ,p2.attrvalueid attrvalueid2 ,p1.sku
from (
select sku ,productid ,min(attrid) attrid
from #ProductRelationAttr group by sku ,productid
)f join #ProductRelationAttr p1 on f.sku = p1.sku and f.productid = p1.productid and f.attrid = p1.attrid
left join #ProductRelationAttr p2 on p1.sku = p2.sku and p1.attrid <> p2.attrid and p1.productid = p2.productid
drop table #ProductRelationAttr
CREATE TABLE #ProductRelationAttr
(
id int identity primary key ,
productid int ,
attrid int,
attrvalueid int,
sku varchar(20)
)
--测试数据
INSERT INTO #ProductRelationAttr
SELECT 10001, 1, 4 , 'EP001X' UNION
SELECT 10001, 1, 5 , 'EP002X' UNION
SELECT 10001, 2, 2 , 'EP001X' UNION
SELECT 10001, 2, 3 , 'EP002X' UNION
SELECT 10002, 1, 4 , 'EP003X' UNION
SELECT 10001, 3, 2 , 'EP001X'
select * ,row_number() over(partition by sku ,productid order by attrid)list
into #table
from #ProductRelationAttr
declare @i int = 0,@sql varchar(max)='',@name varchar(max)='',@n int = 1 ,@str varchar(max)=''
select @i = max(list) from #table
while (@n < @i)
begin
set @n = @n + 1
set @sql = @sql + 'left join #table t'+ cast(@n as varchar(4))
+ ' on t1.sku = t' + cast(@n as varchar(4)) +'.sku and t1.productid = t' + cast(@n as varchar(4))
+'.productid and t1.list + ' + cast(@n-1 as varchar(4)) +' = t' + cast(@n as varchar(4))+'.list '
set @name = @name + ',t' + cast(@n as varchar(4)) +'.attrid attrid' + cast(@n as varchar(4))
+',t' + cast(@n as varchar(4)) +'.attrvalueid attrvalueid' + cast(@n as varchar(4))
end
set @str = '
select row_number() over(order by t1.id) id ,t1.productid ,t1.attrid attrid1 ,t1.attrvalueid attrvalueid1 '+ @name +'
,t1.sku
from #table t1 '+ @sql +'
where t1.list = 1
'
exec (@str)
drop table #ProductRelationAttr ,#table
/**结果如下
id productid attrid1 attrvalueid1 attrid2 attrvalueid2 attrid3 attrvalueid3 sku
1 10001 1 4 2 2 3 2 EP001X
2 10001 1 5 2 3 NULL NULL EP002X
3 10002 1 4 NULL NULL NULL NULL EP003X
**/