Deprecated: Assigning the return value of new by reference is deprecated in /home/mlabs/public_html/wp-settings.php on line 472

Deprecated: Assigning the return value of new by reference is deprecated in /home/mlabs/public_html/wp-settings.php on line 487

Deprecated: Assigning the return value of new by reference is deprecated in /home/mlabs/public_html/wp-settings.php on line 494

Deprecated: Assigning the return value of new by reference is deprecated in /home/mlabs/public_html/wp-settings.php on line 530

Deprecated: Assigning the return value of new by reference is deprecated in /home/mlabs/public_html/wp-includes/cache.php on line 103

Deprecated: Assigning the return value of new by reference is deprecated in /home/mlabs/public_html/wp-includes/query.php on line 21

Deprecated: Assigning the return value of new by reference is deprecated in /home/mlabs/public_html/wp-includes/theme.php on line 623
MetricLabs » Merge

Archive

Posts Tagged ‘Merge’

Sentencia MERGE Sql Server 2008

Noviembre 9th, 2007

Investigando sobre las nuevas características que trae el Sql Server 2008 me encontré con una nueva sentencia muy útil para las etapas de warehousing.

Esta sentencia se llama MERGE, y como su nombre lo dice combina un origen de datos con un destino de datos, que en una situación típica de warehousing corresponderían por ejemplo a la tabla actual de Reclamos del mes recién cerrado y la tabla maestro de Reclamos del warehouse.

– Preparamos datos de ejemplo

DECLARE @Reclamos TABLE (Rut INT, Reclamos INT, Activo char(1))

INSERT @Reclamos

SELECT 1, 1, ‘S’

UNION ALL

SELECT 2, 1, ‘S’

DECLARE @NewReclamos TABLE (Rut INT, Reclamos INT, Activo char(1))

INSERT @NewReclamos

SELECT 1, 0, ‘N’

UNION ALL

SELECT 2, 1, ‘S’

UNION ALL

SELECT 2, 1, ‘S’

UNION ALL

SELECT 3, 1, ‘S’

SELECT * FROM @Reclamos

SELECT * FROM @NewReclamos

@Reclamos @NewReclamos

Rut Reclamos Activo Rut Reclamos Activo
1 1 S 1 0 N
2 1 S 2 1 S
2 1 S
3 1 S

– Ejecutamos Merge

MERGE @Reclamos AS r

USING ( SELECT Rut, SUM(Reclamos) Reclamos, MAX(Activo) Activo

FROM @NewReclamos

GROUP BY Rut) AS src ON src.Rut = r.Rut

WHEN MATCHED AND src.Activo = ‘N’

THEN DELETE

WHEN MATCHED

THEN UPDATE SET r.Reclamos = r.Reclamos + src.Reclamos

WHEN NOT MATCHED THEN

INSERT (Rut, Reclamos, Activo)

VALUES (src.Rut, src.Reclamos, src.Activo);

SELECT * FROM @Reclamos

Rut Reclamos Activo
2 3 S
3 1 S

En el ejemplo tenemos una tabla maestro de reclamos que tiene valores para los Rut 1 y 2. Sin embargo en la nueva tabla de reclamos recibida notamos tres cosas:

· El Rut 1 ya no es cliente activo.

· El Rut 2 ha puesto dos nuevos reclamos.

· El Rut 3 ha puesto un reclamo sin tener historial de reclamos.

Lo que hará el comando MERGE será en el primer caso eliminar el registro de la tabla de reclamos, pues el cliente ya no es activo (esto puede ser polémico, pero sirve para el ejemplo).

En el segundo caso actualizara la variable reclamos de manera de agregar los dos nuevos reclamos al reclamo que ya tenía quedando con 3 reclamos.

En el tercer caso insertara al cliente en la maestro de reclamos, pues no existía.

Si bien todo esto era perfectamente posible de implementar en SQL Server 2005, requería de una gran cantidad de código para realizar todas las validaciones necesarias para ejecutar el comando sin errores. Tener una expresión más compacta puede ayudar a tener procesos de ETL mucho más limpios, rápido y con menor probabilidad de errores.

Patricio Cofre Torres

General ,