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

MYSQL sum() for forskellige rækker

Jeg kan tage fejl, men efter hvad jeg forstår

  • conversions.id er den primære nøgle af dine tabel konverteringer
  • stats.id er den primære nøgle af din tabel statistik

For hvert konverterings.id har du således højst ét ​​berørt links.id.

Din anmodning er lidt som at lave det kartesiske produkt af 2 sæt :

[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 

og for hvert link får du sizeof([klik]) x sizeof([konverteringer]) linjer

Som du har bemærket, kan antallet af unikke konverteringer i din anmodning opnås via en

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

denne distinkte formår at fjerne alle [klik]-linjerne i det kartesiske produkt

men klart

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

I dit tilfælde, siden

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

du har

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

så jeg ville teste din anmodning med

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;

Hold mig orienteret !Jerome



  1. SQL-fejl:ORA-02000:mangler ALTID nøgleord, når der oprettes en identitetskolonnebaseret tabel

  2. Forskellen mellem numerisk, float og decimal i SQL Server

  3. Opdater flere kolonner i MERGE-sætning ORACLE

  4. Database + Windows-godkendelse + brugernavn/adgangskode?