• + 0 comments

    SELECT c.contest_id, c.hacker_id, c.name,

    -- PARAMETROS GENERALES QUE DEBE SEGUIR EL RESTO DEL CODIGO, SIEMPRE QUE

       SUM(IFNULL(ss.total_submissions,0)) total_sub,
       SUM(IFNULL(ss.total_accepted_submissions,0)) total_acc,
       SUM(IFNULL(vs.total_views,0)) total_views,
       SUM(IFNULL(vs.total_unique_views,0)) total_uniq
    

    FROM Contests c

    -- camino -> Colegio -> encuesta -> desafios, para cada colegio hay una encuesta y para cada encuesta uno o multiples desafios (Union de tablas por un dato en comun)

    JOIN Colleges uc ON c.contest_id=uc.contest_id -- Colegio -> encuesta JOIN Challenges ch ON uc.college_id=ch.college_id -- encuesta -> desafio

    LEFT JOIN (SELECT challenge_id, SUM(total_submissions) total_submissions, SUM(total_accepted_submissions) total_accepted_submissions FROM Submission_Stats GROUP BY challenge_id) ss ON ch.challenge_id = ss.challenge_id -- Agrupar por challenge id, uniendo filas de desafios con submissions

    LEFT JOIN (SELECT challenge_id, SUM(total_views) total_views, SUM(total_unique_views) total_unique_views FROM View_Stats GROUP BY challenge_id) vs ON ch.challenge_id=vs.challenge_id -- Agrupar por challenge id, uniendo filas de desafios con la de envios

    GROUP BY c.contest_id, c.hacker_id, c.name -- Agrupar segun como se relacionen

    -- Filtrar los grupos donde almenos tengan un campo que no este vacio HAVING SUM(IFNULL(ss.total_submissions,0)+IFNULL(ss.total_accepted_submissions,0) +IFNULL(vs.total_views,0)+IFNULL(vs.total_unique_views,0))>0 ORDER BY c.contest_id;