Tengo dos tablas tblProducts y temptable. temptable contiene los detalles de la cantidad de stock de productos vendidos. Quiero actualizar la cantidad vendida de productos en tblproduct. Mi problema es que la tabla temporal tendrá múltiples registros para el mismo producto y cuando la actualice usando unirlo, actualice el valor anterior en lugar del nuevo.

tblProduct         tempTable
==============     ==========
ProductId            Id
Name                 ProductId
StockQuantity        SoldQuantity
                     OrderType

--------------
tblProduct
--------------
ProductId     Name         TotalSoldQuantity
1          Product1           10    
2          Product2           20

-------------
tempTable
-------------
Id      ProductId   SoldQuantity  OrderType
1          1             5           1
2          1             5           2

He escrito a continuación la consulta:

 UPDATE P SET P.TotalSoldQuantity = P.TotalSoldQuantity + T.SoldQuantity 
 FROM tempTable T JOIN tblProduct P ON P.ProductId = T.ProductId

Esta consulta actualiza TotalSoldQuantity del producto1 a 15 en lugar de 20. Debe actualizarse uno por uno después de tomar el valor actualizado de los registros anteriores.

Por favor, ayúdeme.

0
Raj 10 may. 2019 a las 18:13

3 respuestas

La mejor respuesta

Primero debe agregar SoldQuantity para obtener el total vendido y luego actualizar:

WITH TotalAgg AS
(SELECT T.ProductId, SUM(T.SoldQuantity) AS TSQA FROM tempTable AS T GROUP BY T.ProductId)
UPDATE P SET P.TotalSoldQuantity = P.TotalSoldQuantity + T.TSQA 
FROM TotalAgg T JOIN tblProduct P ON P.ProductId = T.ProductId
2
Piotr 10 may. 2019 a las 16:09

Lo escribiría así, evitando la sintaxis ACTUALIZACIÓN no estándar ... DE, y proporcionando un patrón simple para examinar los cambios antes de aplicarlos:

with q as
(
  select p.ProductId, 
         p.TotalSoldQuantity, 
         AdditionalSoldQuantity = (select sum(SoldQuantity) from tempTable where productId = p.ProductId) 
  from tblProduct p
)
--select * from q
update q set TotalSoldQuantity = TotalSoldQuantity + AdditionalSoldQuantity 
1
David Browne - Microsoft 10 may. 2019 a las 15:24

Debe agregar sus cantidades por ProductId en su tabla temporal y unirlas a los Productos.

 UPDATE P 
 SET P.TotalSoldQuantity = P.TotalSoldQuantity + T.SoldQuantity 
 FROM 
    (SELECT ProductId, SUM(TotalSoldQuantity) FROM tempTable GROUP BY ProductId) T JOIN 
    tblProduct P ON P.ProductId = T.ProductId
0
FizzBuzz 10 may. 2019 a las 15:20