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_scanson selecciones independientes; ¿No estás seguro de cuál es el problema aquí?havingcláusula sin ungroup by(que por defecto es un solo grupo). Actúa como unawhereclá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í
COALESCEtienes un ejemplo de tu consulta:En mi humilde opinión
COALESCE, no debería usarse conAVGporque modifica el valor.NULLsignifica desconocido y nada más. No es como usarlo enSUM. En este ejemplo, si reemplazamosAVGporSUM, 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 NULLenWHEREla cláusula para evitar estos valores desconocidos.fuente
from web_price_scan...parece repetido ...NULLIF(v1, v2)hace más o menos lo contrarioCOALESCEen que devuelveNULLsiv1es 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