Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MYSQL sum() para linhas distintas


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