如何解决 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 |
让我们退一步。您似乎正在尝试手动构建与 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 演示了上述两点。