Tengo una consulta que devuelve avg (price)
select avg(price)
from(
select *, cume_dist() OVER (ORDER BY price desc) from web_price_scan
where listing_Type='AARM'
and u_kbalikepartnumbers_id = 1000307
and (EXTRACT(Day FROM (Now()-dateEnded)))*24 < 48
and price>( select avg(price)* 0.50
from(select *, cume_dist() OVER (ORDER BY price desc)
from web_price_scan
where listing_Type='AARM'
and u_kbalikepartnumbers_id = 1000307
and (EXTRACT(Day FROM (Now()-dateEnded)))*24 < 48
)g
where cume_dist < 0.50
)
and price<( select avg(price)*2
from( select *, cume_dist() OVER (ORDER BY price desc)
from web_price_scan
where listing_Type='AARM'
and u_kbalikepartnumbers_id = 1000307
and (EXTRACT(Day FROM (Now()-dateEnded)))*24 < 48
)d
where cume_dist < 0.50)
)s
having count(*) > 5
¿Cómo hacer que devuelva 0 si no hay ningún valor disponible?
sql
postgresql
Andrés
fuente
fuente
from web_price_scan
son selecciones independientes; ¿No estás seguro de cuál es el problema aquí?having
cláusula sin ungroup by
(que por defecto es un solo grupo). Actúa como unawhere
cláusula sobre resultados agregados. En este caso, las filas solo se devuelven si la subconsulta de primer nivel devuelve más de 5 filas.Respuestas:
usar coalesce
Editar
Aquí
COALESCE
tienes un ejemplo de tu consulta:En mi humilde opinión
COALESCE
, no debería usarse conAVG
porque modifica el valor.NULL
significa desconocido y nada más. No es como usarlo enSUM
. En este ejemplo, si reemplazamosAVG
porSUM
, el resultado no se distorsiona. Agregar 0 a una suma no perjudica a nadie, pero calculando un promedio con 0 para los valores desconocidos, no se obtiene el promedio real.En ese caso, me gustaría añadir
price IS NOT NULL
enWHERE
la cláusula para evitar estos valores desconocidos.fuente
from web_price_scan...
parece repetido ...NULLIF(v1, v2)
hace más o menos lo contrarioCOALESCE
en que devuelveNULL
siv1
es igualv2
.(esta respuesta se agregó para proporcionar ejemplos más breves y genéricos de la pregunta, sin incluir todos los detalles específicos del caso en la pregunta original).
Hay dos "problemas" distintos aquí, el primero es si una tabla o subconsulta no tiene filas, el segundo es si hay valores NULL en la consulta.
Para todas las versiones que he probado, postgres y mysql ignorarán todos los valores NULL al promediar, y devolverán NULL si no hay nada sobre lo que promediar. Esto generalmente tiene sentido, ya que NULL debe considerarse "desconocido". Si desea anular esto, puede usar coalesce (como lo sugiere Luc M).
por supuesto, "from foo" puede ser reemplazado por "from (... cualquier lógica complicada aquí ...) como foo"
Ahora, ¿la fila NULL en la tabla debe contarse como 0? Luego, coalesce debe usarse dentro de la llamada avg.
fuente
Puedo pensar en 2 formas de lograr esto:
IFNULL ():
La función IFNULL () devuelve un valor especificado si la expresión es NULL. Si la expresión NO es NULL, esta función devuelve la expresión.
Sintaxis:
Ejemplo de IFNULL () con su consulta:
JUNTARSE()
La función COALESCE () devuelve el primer valor no nulo en una lista.
Sintaxis:
Ejemplo de COALESCE () con su consulta:
fuente