Tenho uma consulta que retorna média (preço)
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
como fazê-lo retornar 0 se nenhum valor estiver disponível?
sql
postgresql
Andrew
fonte
fonte
from web_price_scan
são seleções separadas; não tenho certeza qual é o problema aqui?having
cláusula sem umgroup by
(que o padrão é um único grupo). Ele atua como umawhere
cláusula sobre resultados agregados. Nesse caso, as linhas são retornadas apenas se mais de 5 linhas forem retornadas pela subconsulta de primeiro nível.Respostas:
usar coalescer
Editar
Aqui está um exemplo de
COALESCE
com sua consulta:IMHO
COALESCE
não deve ser usado comAVG
porque modifica o valor.NULL
significa desconhecido e nada mais. Não é como usá-loSUM
. Neste exemplo, se substituirmosAVG
porSUM
, o resultado não será distorcido. Adicionar 0 a uma soma não prejudica ninguém, mas calculando uma média com 0 para os valores desconhecidos, você não obtém a média real.Nesse caso, gostaria de acrescentar
price IS NOT NULL
naWHERE
cláusula para evitar esses valores desconhecidos.fonte
from web_price_scan...
parece repetido ...NULLIF(v1, v2)
faz praticamente o oposto deCOALESCE
, pois retornaNULL
se forv1
igualv2
.(esta resposta foi adicionada para fornecer exemplos mais curtos e genéricos para a pergunta - sem incluir todos os detalhes específicos do caso na pergunta original).
Existem dois "problemas" distintos aqui, o primeiro é se uma tabela ou subconsulta não tem linhas, o segundo é se há valores NULL na consulta.
Para todas as versões que testei, postgres e mysql irão ignorar todos os valores NULL ao calcular a média e retornará NULL se não houver nada para calcular a média. Isso geralmente faz sentido, pois NULL deve ser considerado "desconhecido". Se você quiser sobrescrever isso, você pode usar coalescer (como sugerido por Luc M).
claro, "de foo" pode ser substituído por "de (... qualquer lógica complicada aqui ...) como foo"
Agora, a linha NULL na tabela deve ser contada como 0? Em seguida, coalescer deve ser usado dentro da chamada avg.
fonte
Posso pensar em 2 maneiras de fazer isso:
IFNULL ():
A função IFNULL () retorna um valor especificado se a expressão for NULL. Se a expressão for NOT NULL, esta função retornará a expressão.
Sintaxe:
Exemplo de IFNULL () com sua consulta:
COALESCE ()
A função COALESCE () retorna o primeiro valor não nulo em uma lista.
Sintaxe:
Exemplo de COALESCE () com sua consulta:
fonte