Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL sum() per righe distinte

Potrei sbagliarmi ma da quello che ho capito

  • id conversioni è la chiave primaria della tua tabella conversioni
  • stats.id è la chiave primaria della tua tabella statistiche

Pertanto, per ogni conversions.id hai al massimo un link.id interessato.

La tua richiesta è un po' come fare il prodotto cartesiano di 2 set :

[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 per ogni link, ottieni sizeof([clicks]) x sizeof([conversions]) righe

Come hai notato, il numero di conversioni uniche nella tua richiesta può essere ottenuto tramite un

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

questo distinto riesce a rimuovere tutte le righe [clic] nel prodotto cartesiano

ma chiaramente

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

Nel tuo caso, poiché

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

hai

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

quindi testerei la tua richiesta 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;

Tienimi aggiornato! Jerome