Se o supervisor não tem linhas correspondentes na tabela pedidos, mas você precisa incluí-lo na consulta, então você precisa fazer uma LEFT JOIN pela tabela de supervisores:
SELECT s._id, s.nome, IFNULL(SUM(p.valor),0) as valor_total FROM supervisor s LEFT JOIN pedidos p on s._id = p.id_supervisor WHERE data BETWEEN '2015-11-01' AND '2015-11-30' GROUP BY s._id
Mas continua não me retornando os supervisores com valores 0.
R
rmendes08
Tentou colocar o IFNULL dentro da função SUM() ?
R
Rodrigo1895
Sim, tentei fazer como você postou, mas da este erro:
wrong number of arguments to function IFNULL()
Estou usando SQLite
R
rmendes08
eu tinha errado os parênteses:
SUM(IFNULL(valor,0))
R
Rodrigo1895
Fiz assim:
SELECT s._id, s.nome, SUM(IFNULL(p.valor,0)) as total_pedidos FROM supervisor s LEFT JOIN pedidos p on s._id = p.id_supervisor WHERE data BETWEEN '2016-11-01' AND '2016-11-30' GROUP BY s._id
Continua me retornando apenas supervisores que contem valores na tabela pedidos
Minhas tabelas são assim: Tabela Supervisor
_id
nome
Tabela Pedidos:
_id
id_supervisor
data
valor
R
rmendes08
Execute esta query:
select count(s._id) from supervisor s where s._id not in ( select distinct p.id_supervisor from pedidos p where p.data BETWEEN '2016-11-01' AND '2016-11-30' )
se o resultado for 0 é porque todos os supervisores tem pedidos.
R
Rodrigo1895
resultado 2, então 2 supervisores não tem pedidos.
É isso mesmo que tem no BD
Tenho 3 supervisores, neste intervalo de data apenas 1 tem pedidos. Mas preciso retornar os outros 2 com valores zerados
R
rmendes08
Tente trocar o LEFT JOIN por LEFT OUTER JOIN
R
Rodrigo1895
já tinha tentado, continuou não retornando
R
Rodrigo1895
Pensei que o LEFT JOIN nao era suportado pelo SQLITE.
Mas conferi a documentação e não dá suporte apenas para RIGHT OUTER JOIN e
FULL OUTER JOIN.
SELECT s._id, s.nome, IFNULL(p.valor,0) as total_pedidos FROM supervisor s LEFT JOIN pedidos p on s._id = p.id_supervisor WHERE data BETWEEN '2016-11-01' AND '2016-11-30' GROUP BY s._id
Continuou não retornando
E o resultado da sua query foi esse:
Executando a query pelo cmd teve mais alguns detalhes:
R
rmendes08
Cara, o plano de execução tá normal, ele faz o table scan na pedidos e depois recupera as linhas do pedido. Tenta trocar a ordem das tabela no join:
Os supervisores não têm pedidos ou não tem pedidos nas datas indicadas?
P
Solucao aceita
pmlm
O que tu precisas, provavelmente, é:
select s.id, s.nome, (select sum(p.valor) from pedidos p where p.id_supervisor = s.id and p.data between '2016-11-01' AND '2016-11-30') as valor from supervisor s
R
Rodrigo1895
De 3 supervisores apenas 1 tem pedidos na data indica.
Com seu exemplo deu certo…
Fiz assim:
SELECT s._id, s.nome, (SELECT IFNULL(SUM(p.valor),0) FROM pedidos p WHERE p.id_supervisor = s._id AND p.data BETWEEN '2016-11-01' AND '2016-11-30') AS valor FROM supervisor s
Vlw…
Porque do outro modo não dava certo?
Z
Zenilton_Sti
Eu uso a função COALESCE exemplo COALESCE(sum(meu campo), 0) se o valor for nulo ele retorna ZERO
SELECT s._id, s.nome, (SELECT IFNULL(SUM(p.valor),0) FROM pedidos p WHERE p.id_supervisor = s._id AND p.data BETWEEN '2016-11-01' AND '2016-11-30') AS valor FROM supervisor s
Mas vlw, outra forma de se fazer.
P
Plocky
existe a função NVL para isso, e deve ser utilizado assim:
SELECT NVL(SUM(valor), 0) AS valor FROM pedidos
WHERE data BETWEEN ‘2015-10-01’ AND '2015-10-31’
GROUP BY id_supervisor