While 循环函数 - 删除重复项

问题描述 投票:0回答:1

如何解决 while 循环函数的重复问题。我希望它更新到某个密钥。

Declare @loop1 int = 0     
Declare @loop2 int = (Select count(*) from #WorkCentre2)    
Declare @SQL varchar(8000)    
    
while @loop1  < @loop2    
begin    
 Set @loop1 = @loop1 + 1     
 Set @SQL = 'Alter table #temp1 add [' + (Select WorkCentre from #WorkCentre2  where AutoID = @loop1) + '] varchar(50)'    
 exec(@SQL)    
     
 Set @SQL = '    
 Update #temp1 set     
  [' + (Select WorkCentre from #WorkCentre2  where AutoID = @loop1) + '] = ManufacturingTracking.PercentCompleted    
 From ManufacturingTracking (nolock)    
      inner join #temp1    
   on #temp1.ID = ManufacturingTracking.ManufacturingTrackingId    
   and ManufacturingTracking.WorkCentre = ''' + (Select WorkCentre from #WorkCentre2  where AutoID = @loop1) + ''''    
exec(@SQL)

结果:

身份证 销售订单 工作 客户 材质类型 零件厚度 数量必填 LCT - 激光切割 BNS - 简单弯曲 QCT-质量控制
139690 000001000071138 JG00415389 GHH002 - GHHMM 制造(私人有限公司)有限公司 SS304L 6.000000 3.000000 100.00
139691 000001000071138 JG00415389 GHH002 - GHHMM 制造(私人有限公司)有限公司 SS304L 6.000000 3.000000 100.00
139692 000001000071138 JG00415389 GHH002 - GHHMM 制造(私人有限公司)有限公司 SS304L 6.000000 3.000000 0.00
t-sql while-loop
1个回答
0
投票

让我们退一步。您似乎正在尝试手动构建与 ManufacturingTracking(订单?)表连接的

#temp
数据的
pivot

如果您只是打算

SELECT * FROM #Temp
最后,您可以跳过所有这些循环逻辑并使用
PIVOT
构建最终结果。

SELECT *
FROM #Temp T
LEFT JOIN ManufacturingTracking MT
  ON MT.ManufacturingTrackingId = T.ID
PIVOT (
    SUM(MT.PercentCompleted)
    FOR MT.WorkCentre IN ([LCT - LASER CUTTING], [BNS - BENDING SIMPLE], [QCT - QUALITY CONTROL])
) PVT
ORDER BY PVT.ID

结果:

身份证 销售订单 工作 客户 材质类型 零件厚度 数量必填 制造跟踪ID BNS - 简单弯曲 LCT - 激光切割 QCT-质量控制
139690 000001000071138 JG00415389 GHH002 - GHHMM 制造(私人有限公司)有限公司 SS304L 6.000000 3.000000 139690 100.000000
139691 000001000071138 JG00415389 GHH002 - GHHMM 制造(私人有限公司)有限公司 SS304L 6.000000 3.000000 139691 100.000000
139692 000001000071138 JG00415389 GHH002 - GHHMM 制造(私人有限公司)有限公司 SS304L 6.000000 3.000000 139692 0.000000

如果

WorkCentre
值不固定,您可以使用动态SQL构建适当的数据驱动列列表。

DECLARE @Columns VARCHAR(MAX) = (
    SELECT STRING_AGG(QUOTENAME(W.WorkCentre), ', ')
        WITHIN GROUP(ORDER BY W.WorkCentre) -- You may need to define a different order
    FROM (
       SELECT DISTINCT MT.WorkCentre
       FROM ManufacturingTracking MT
    ) W
)

DECLARE @Sql VARCHAR(MAX) = '
    SELECT *
    FROM #Temp T
    LEFT JOIN ManufacturingTracking MT
        ON MT.ManufacturingTrackingId = T.ID
    PIVOT (
        SUM(MT.PercentCompleted)
        FOR MT.WorkCentre IN (' + @Columns + ')
    ) PVT
    ORDER BY PVT.ID
'

The results are the same, except for the pivoted column order.

PRINT @Sql
EXEC (@Sql)

这个 db<>fiddle 演示了上述两点。

© www.soinside.com 2019 - 2024. All rights reserved.