martes, 1 de diciembre de 2015

Receta T-SQL No. 3-5: Remoción de Valores en un Agregado

Índice

1. Introducción
2. Palabras Clave
3. Problema
4. Solución
5. Discusión de la Solución
5.1 La función NULLIF
5.2 Equivalencia a CASE
6. Práctica: Código T-SQL
7. Conclusiones
8. Literatura & Enlaces

1. Introducción

En esta receta T-SQL se estudia el proceso de remoción de valores en una función de agregación. Este proceso es importante para cálculos que requieran descartar o discriminar ciertos valores que cumplan una determinada condición. En particular que se descarten a aquellos valores o expresiones que generan como resultado NULL. Las funciones de agregación, como se demuestra, omiten este tipo de valor para efectuar el cálculo que corresponda: promedio, conteo, máximo, mínimo entre otros.

2. Palabras Clave

  • Agregado
  • Función de agregación
  • NULL
  • Varianza

3. Problema

Se requiere omitir valores en una función de agregado que cumpla con una determinada condición.

4. Solución

Transact-SQL cuenta con la función NULLIF para asignar NULL a una expresión que cumpla una determinada expresión.

5. Discusión de la Solución

5.1 La función NULLIF

La función NULLIF ("NULLIF (Transact-SQL)", 2015) retorna el valor no definido NULL en el caso que dos expresiones sean iguales.

Sintaxis: 

NULLIF (expresion, expresion)

Los argumentos de NULLIF, expresion, corresponden a cualquier expresión válida en T-SQL. Los valores de retorno posible son:
  • Si las expresiones no son iguales, NULLIF retorna la primera expresión.
  • Si las expresiones son iguales, NULLIF retorna NULL.

5.2 Equivalencia a CASE

NULLIF es semánticamente equivalente a CASE ("CASE Transact-SQL", 2015). Sin embargo, CASE, a nivel sintáctico, requiere de elementos adicionales para construir una expresión equivalente a NULLIF.

Ejemplo con NULLIF:

SELECT ProductID,
MakeFlag,
FinishedGoodsFlag,
NULLIF(MakeFlag, FinishedGoodsFlag) AS 'NULL sin son iguales'
FROM Production.Product
WHERE ProductID < 10;

Ejemplo con CASE:

SELECT ProductID,
MakeFlag,
FinishedGoodsFlag,
'NULL sin son iguales' =
CASE
WHEN MakeFlag = FinishedGoodsFlag THEN NULL
ELSE MakeFlag
END
FROM Production.Product
WHERE ProductID < 10;

6. Práctica: Código T-SQL

Se recurre al problema planteado por Brimhall et al (2012) para ejemplificar la utilidad de NULLIF:
Determinar la varianza de los retrasos en producción entre la fecha efectiva de inicio y la fecha de inicio programada de lotes de producción. 
En particular: 
  • ¿Cuál es la varianza de todas las operaciones?
  • ¿Cuál es la varianza de todas las operaciones donde la varianza no es cero?
(Para saber más acerca del concepto de varianza, se recomienda la lectura de Varianza y desviación estándar.)


En la línea 2 se calcula la varianza de todas las operaciones, considerando incluso los valores de la diferencia de las columnas ScheduledStartDate y ActualStartDate igual a cero; mientras que en la línea 3 se calcula la varianza sólo para las operaciones que tienen diferencia de fechas distinto de cero.
Varianza y varianza ajustada
Figura 1. Varianza y varianza ajustada.

7. Conclusiones

Se demostró el uso de la función NULLIF; la cual es útil para retornar NULL para aquellas expresiones iguales. Se destacó la similitud de NULLIF y CASE: la sintaxis declarativa de NULLIF es más simple, sin embargo con CASE se puede construir expresiones de selección más complejas. En el ejemplo de la sección práctica se uso NULLIF para destacar aquellas operaciones que habían iniciado en distintos días. En la próximo T-SQL se estudiará cómo forzar la unicidad con NULL.

8. Literatura & Enlaces

Brimhall, J., Dye, D., Gennick, J., Roberts, A., Sheffield, W. (2012). SQL Server 2012 T-SQL Recipes - A Problem-Solucion Approach. United States: Apress.
NULLIF (Transact-SQL) (2015, diciembre 1). Recuperado desde: https://msdn.microsoft.com/en-us/library/ms177562.aspx.
CASE (Transact-SQL) (2015, diciembre 1). Recuperado desde: https://msdn.microsoft.com/en-us/library/ms181765.aspx.
Varianza y desviación estándar (2015, diciembre 1). Recuperado desde: http://www.disfrutalasmatematicas.com/datos/desviacion-estandar.html.


V

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.