sql >> Base de Datos >  >> RDS >> Mysql

MYSQL sum () para filas distintas

Puede que me equivoque pero por lo que entiendo

  • conversiones.id es la clave principal de su tabla conversiones
  • estadísticas.id es la clave principal de tu tabla estadísticas

Por lo tanto, para cada conversions.id, tiene como máximo un link.id afectado.

Su solicitud es un poco como hacer el producto 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 

y para cada enlace, obtienes tamaño de ([clics]) x tamaño de ([conversiones]) líneas

Como notó, la cantidad de conversiones únicas en su solicitud se puede obtener a través de un

count(distinct conversions.id) = sizeof([conversions])

este distintivo logra eliminar todas las líneas [clics] en el producto cartesiano

pero claramente

sum(conversions.value) = sum([conversions].value) * sizeof([clicks])

En tu caso, ya que

count(*) = sizeof([clicks]) x sizeof([conversions])
count(*) = sizeof([clicks]) x count(distinct conversions.id)

tienes

sizeof([clicks]) = count(*)/count(distinct conversions.id)

así que probaría su solicitud con

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;

¡Mantenme informado! Jerome