Columna calculada en base a dos columnas calculadas
-
23-08-2019 - |
Pregunta
Estoy tratando de hacer un cálculo SELECT
bastante complicado que voy a generalizar:
- consulta principal es un comodín para seleccionar una tabla
- Una subconsulta hace un
COUNT()
de todos los elementos en función de una condición (esto funciona bien) - Otro subconsulta hace un
SUM()
de números en una columna basada en otra condición. Esto también funciona correctamente, excepto cuando no hay registros cumplen las condiciones, devuelveNULL
.
En principio queríamos sumar las dos subconsultas, algo así como (subquery1)+(subquery2) AS total
que funciona bien a menos subquery2 es nulo, en cuyo caso se convierte en total
nula, independientemente de lo que es el resultado de subquery1. Mi segundo pensamiento fue para tratar de crear una tercera columna que iba a ser un cálculo de las dos subconsultas (es decir, (subquery1) AS count1, (subquery2) AS count2, count1+count2 AS total
), pero no creo que es posible calcular dos columnas calculadas, e incluso si lo fuera, me siento como el se aplica el mismo problema.
¿Alguien tiene una solución elegante a este problema fuera de sólo conseguir los dos valores subconsulta y un total de ellos en mi programa?
Gracias!
Solución
Dos cuestiones pasando aquí:
-
No se puede utilizar un alias de columna en otra expresión en la misma lista SELECT.
Sin embargo, puede establecer alias en una subconsulta tabla derivada y utilizarlos en una consulta externa.
-
No se puede hacer aritmética con NULL, porque NULL no es cero .
Sin embargo, puede NULO "por defecto" a un valor no nulo utilizando la función
COALESCE()
. Esta función devuelve su primer argumento no NULL.
Este es un ejemplo:
SELECT *, count1+count2 AS total
FROM (SELECT *, COALESCE((subquery1), 0) AS count1,
COALESCE((subquery2), 0) AS count2
FROM ... ) t;
(recordar que una tabla derivada se debe dar un alias de la tabla, "t" en este ejemplo)
Otros consejos
En primer lugar, la función COALESCE debe ayudar a cuidar de cualquier problema nulos.
¿Podría utilizar una unión para combinar esas dos consultas en un único conjunto de resultados, a continuación, tratarla como una subconsulta para su posterior análisis?
O tal vez yo no entendía por completo su pregunta?
Me gustaría probar (para la segunda consulta) algo como: SELECT SUM (ISNULL (MICOLUMNA, 0)) // Por favor, compruebe la sintaxis en la que antes de usarlo, aunque ...
Esto debería devolver 0 en lugar de nulo para cualquier instancia de ser que la columna cero.
Puede ser que sea necesario decir, pero ya se está usando dentro de un programa, prefiere utilizar la lógica del programa para sumar los dos resultados (NULL y un número), debido a los problemas de portabilidad.
¿Quién sabe cuando está en desuso función COALESCE o si otro DBMS soporta o no.