posso estar errado mas pelo que entendi
- conversions.id é a chave primária de sua tabela conversões
- stats.id é a chave primária de sua tabela estatísticas
Assim, para cada conversions.id você tem no máximo um links.id impactado.
Seu pedido é um pouco como fazer o produto cartesiano de 2 conjuntos:
[clicks]
SELECT *
FROM links
LEFT OUTER JOIN stats ON links.id = stats.parent_id
[conversions]
SELECT *
FROM links
LEFT OUTER JOIN conversions ON links.id = conversions.link_id
e para cada link, você obtém as linhas sizeof([clicks]) x sizeof([conversions])
Como você observou, o número de conversões exclusivas em sua solicitação pode ser obtido por meio de um
count(distinct conversions.id) = sizeof([conversions])
este distinto consegue remover todas as linhas [clicks] do produto cartesiano
mas claramente
sum(conversions.value) = sum([conversions].value) * sizeof([clicks])
No seu caso, desde
count(*) = sizeof([clicks]) x sizeof([conversions])
count(*) = sizeof([clicks]) x count(distinct conversions.id)
Você tem
sizeof([clicks]) = count(*)/count(distinct conversions.id)
então eu testaria seu pedido com
SELECT links.id,
count(DISTINCT stats.id) as clicks,
count(DISTINCT conversions.id) as conversions,
sum(conversions.value)*count(DISTINCT conversions.id)/count(*) as conversion_value
FROM links
LEFT OUTER JOIN stats ON links.id = stats.parent_id
LEFT OUTER JOIN conversions ON links.id = conversions.link_id
GROUP BY links.id
ORDER BY links.created desc;
Mantenha-me informado! Jerome