Pregunta

Estoy tratando de hacer un cálculo SELECT bastante complicado que voy a generalizar:

  1. consulta principal es un comodín para seleccionar una tabla
  2. Una subconsulta hace un COUNT() de todos los elementos en función de una condición (esto funciona bien)
  3. 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, devuelve NULL.

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!

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top