repetir - Combinación de registros duplicados en SQL Server
no repetir registros en consulta sql (2)
Tengo una tabla en SQL Server 2012 que contiene una lista de partes, la ubicación de las piezas y la cantidad disponible. El problema que tengo es que alguien pone un espacio delante de la ubicación cuando lo agregaron a la base de datos. Esto permitió que hubiera dos registros.
Necesito crear un trabajo que encuentre las partes con espacios antes de la ubicación y agregar esas partes a las partes idénticas sin espacios en frente de la ubicación. No estoy seguro de dónde comenzar con esto.
Este es el antes:
Partno | PartRev | Location | OnHand | Identity_Column
--------------------------------------------------------------------
0D6591D 000 MV3 55.000 103939
0D6591D 000 MV3 -55.000 104618
Esto es lo que me gustaría tener después de ejecutar el trabajo:
Partno | PartRev | Location | OnHand | Identity_Column
--------------------------------------------------------------------
0D6591D 000 MV3 0 104618
Dos pasos: 1. actualizar los registros con las ubicaciones correctas, 2. eliminar los registros con las ubicaciones incorrectas.
update mytable
set onhand = onhand +
(
select coalesce(sum(wrong.onhand), 0)
from mytable wrong
where wrong.location like '' %''
and trim(wrong.location) = mytable.location
)
where location not like '' %'';
delete from mytable where location like '' %'';
Puede hacer una agrupación con una cláusula HAVING on para identificar los registros. He usado REPLACE
para reemplazar espacios con cadenas vacías en la columna de ubicación, también podría usar LTRIM
y RTRIM
:
CREATE TABLE #Sample
(
[Partno] VARCHAR(7) ,
[PartRev] INT ,
[Location] VARCHAR(5) ,
[OnHand] INT ,
[Identity_Column] INT
);
INSERT INTO #Sample
([Partno], [PartRev], [Location], [OnHand], [Identity_Column])
VALUES
(''0D6591D'', 000, '' MV3'', 55.000, 103939),
(''0D6591D'', 000, ''MV3'', -55.000, 104618)
;
SELECT Partno ,
PartRev ,
REPLACE( Location, '' '', '''') Location,
SUM(OnHand) [OnHand]
FROM #Sample
GROUP BY REPLACE(Location, '' '', '''') ,
Partno ,
PartRev
HAVING COUNT(Identity_Column) > 1;
DROP TABLE #Sample;
Produce:
Partno PartRev Location OnHand
0D6591D 0 MV3 0