sql >> Database >  >> RDS >> Mysql

MYSQL sum() voor verschillende rijen

Ik kan het mis hebben, maar voor zover ik het begrijp

  • conversions.id is de primaire sleutel van uw tabel conversies
  • stats.id is de primaire sleutel van uw tabel statistieken

Dus voor elke conversies.id heeft u maximaal één link.id beïnvloed.

Je verzoek lijkt een beetje op het cartesiaanse product van 2 sets:

[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 

en voor elke link krijg je sizeof([clicks]) x sizeof([conversions]) regels

Zoals u heeft opgemerkt, kan het aantal unieke conversies in uw verzoek worden verkregen via een

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

dit onderscheid slaagt erin om alle [kliks]-lijnen in het cartesiaanse product te verwijderen

maar duidelijk

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

In jouw geval, sinds

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

je hebt

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

dus ik zou je verzoek testen met

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;

Houd me op de hoogte !Jerome



  1. SQL-, unieke en primaire sleutels

  2. JDBC ResultSet krijg kolommen met tabelalias

  3. Hoe UUID() werkt in MariaDB

  4. Alternatief voor lead lag-functie in SQL Server 2008