Como manejar valores NULOS, ANDs y ORs en un SET ANALYSIS

Muchas veces necesitamos preguntar por valores nulos dentro de una expresión para lo que empleamos ISNULL() y su negación NOT ISNULL(). Pero ¿cómo se trata con los elementos nulos dentro de un SET ANALISYS ?

El SET ANALISYS es el equivalente programatico de lo que un usuario hace al seleccionar valores del modelo.  Por lo tanto el problema es, desde un punto de vista del usuario, tratar de SELECCIONAR un campo con valor NULL lo cual es imposible ya que no se puede “clickear” (seleccionar) sobre algo que NO existe en el modelo….!

La solución pasa por entender a todo el modelo como un conjunto y operar sobre él como tal, es decir con algebra booleana; después de todo a esto se refiere la expresión “SET ANALISYS” (Análisis de conjuntos).

Empecemos:

Generemos nuestro modelo con Clientes y Reclamos de los Clientes. Como no todos los clientes tienen reclamos al relacionar ambas tablas obtendremos algunos valores nulos:

Aquí la estructura de las tablas:

Customers:
load * inline [
CustID, Anual_Sales, VIP
1 , 100, Y
2 , 200, Y
3 , 300, Y
4 , 400, N
];

Claims:
Load * inline [
CustID, ClaimID, Claimed_Amount
1, 1, 5
1, 2, 8
4, 3, 15
4, 4, 1
];

Lo que nos genera:

Customers                                                                                                          Claims primera_     Image21

Supongamos que deseamos calcular las ventas anuales de los clientes que NO tienen reclamos, pero ¿cómo preguntamos por algo que no se puede mencionar, seleccionar ni clickear (valor nulo)?

Aquí va la primera respuesta:

 Image22

Lo que hacemos es decir “filtrar TODO (“*”) lo que tenga algún reclamo” y luego lo negamos, obteniendo su complemento (SUM({-<ClaimID={‘*’>} Anual_Sales)).

Esto funciona bien, pero el tema se puede complicar un poco cuando buscamos condiciones más complejas, acá hay que entender que todo lo que pongamos entre <…> va a estar negado y cuando ponemos más de una condición separada por comas es como si estuviéramos usando ANDs pero si negamos todo posiblemente no sea el resultado buscado (p.ej: que ClaimId sea nulo y ….).

Para resolver esto hay que entender que cada <…> que aparece en un SET ANALYSIS es un conjunto en sí mismo y desde luego se puede operar entre conjuntos:

Image23

Aquí ( SUM({-<ClaimID={‘*’}> * <Anual_Sales={“>250”}>} Anual_Sales) ) pedimos todo donde ClaimID es nulo (la negación de cualquier valor) Y (símbolo * representa la intersección) Anual_Sales>250.

Por último y de manera similar se puede operar y obtener ORs entre conjuntos empleando el signo “+”:

 Image24

Acerca de pparnisari
Casi 44 vueltas al sol. Licenciado en sistemas. Curioso, investigador, excelente para resolver problemas prácticos. Casado, 2 hijos, cada vez con mas preguntas y respuestas mas en duda. Almost 44 laps to the sun. System engineer. Curious, researcher, great for solving practical problems. Married, 2 children, each time with more questions and more answers in doubt.

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: