PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como posso juntar 3 tabelas e calcular a soma correta dos campos de 2 tabelas, sem linhas duplicadas?


Se entendi a lógica corretamente, o problema é o produto cartesiano causado pelas duas junções. Sua consulta é um pouco difícil de seguir, mas acho que a intenção é melhor tratada com subconsultas correlacionadas:
select k.*,
       (select sum(cost)
        from ad_group_keyword_network n
        where n.event_date >= '2015-12-27' and
              n.ad_group_keyword_id = 1210802 and
              k.id = n.ad_group_keyword_id
       ) as cost,
       (select sum(clicks)
        from keyword_click c
        where (c.date is null or c.date >= '2015-12-27') and
              k.keyword_id = c.keyword_id               
       ) as clicks
from ad_group_keyword k
where k.status = 2 ;

Aqui é o correspondente SQL Fiddle.

EDITAR:

A subseleção deve ser mais rápida que o group by sobre os dados não agregados. No entanto, você precisa dos índices certos:ad_group_keyword_network(ad_group_keyword_id, ad_group_keyword_id, event_date, cost) e keyword_click(keyword_id, date, clicks) .