sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo puedo unir 3 tablas y calcular la suma correcta de campos de 2 tablas, sin filas duplicadas?

Si entiendo la lógica correctamente, el problema es el producto cartesiano causado por las dos uniones. Su consulta es un poco difícil de seguir, pero creo que la intención se maneja mejor con 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 ;

Aquí es el violín SQL correspondiente.

EDITAR:

La subselección debe ser más rápida que group by en los datos no agregados. Sin embargo, necesita los índices correctos:ad_group_keyword_network(ad_group_keyword_id, ad_group_keyword_id, event_date, cost) y keyword_click(keyword_id, date, clicks) .