Changes between Version 4 and Version 5 of AdvancedReports


Ignore:
Timestamp:
08/07/26 16:15:55 (12 hours ago)
Author:
231175
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedReports

    v4 v5  
    2323            COUNT(e.enrollment_id)::BIGINT AS total_enrollments,
    2424            COALESCE(SUM(p.amount), 0)::NUMERIC AS total_revenue
    25         FROM payment p
    26                  JOIN enrollment e ON p.enrollment_id = e.enrollment_id
     25        FROM enrollment e
     26                 LEFT JOIN payment p
     27                     ON p.enrollment_id = e.enrollment_id
     28                    AND p.payment_status = 'completed'   -- само наплатените пари се промет
    2729        GROUP BY
    2830            EXTRACT(YEAR FROM e.purchase_date),
     
    112114BEGIN
    113115    RETURN QUERY
     116        WITH lecture_progress AS (
     117            SELECT ucp.enrollment_id,
     118                   COUNT(*) FILTER (WHERE ucp.is_completed) * 100.0 / COUNT(*) AS completed_percentage
     119            FROM user_course_progress ucp
     120            GROUP BY ucp.enrollment_id
     121        )
    114122        SELECT
    115123            c.course_id::INTEGER AS course_id,
     
    131139                               THEN (e.completion_date - e.activation_date)
    132140                END), 0)::INTEGER AS avg_days_to_complete,
    133             ROUND(100.0 * COUNT(CASE WHEN e.completion_date IS NOT NULL THEN e.enrollment_id END)::NUMERIC / NULLIF(COUNT(e.enrollment_id), 0), 2) AS completion_rate_percentage,
    134             ROUND(AVG(
    135                           COALESCE(
    136                                   (SELECT COUNT(CASE WHEN ucp.is_completed = true THEN 1 END)::NUMERIC * 100.0 /
    137                                           NULLIF(COUNT(*), 0)
    138                                    FROM user_course_progress ucp
    139                                    WHERE ucp.enrollment_id = e.enrollment_id), 0
    140                           )
    141                   ), 2)::NUMERIC AS avg_lecture_completion_percentage
     141            COALESCE(
     142                ROUND(100.0 * COUNT(CASE WHEN e.completion_date IS NOT NULL THEN e.enrollment_id END)::NUMERIC
     143                      / NULLIF(COUNT(e.enrollment_id), 0), 2),
     144                0)::NUMERIC AS completion_rate_percentage,
     145            COALESCE(ROUND(AVG(lp.completed_percentage), 2), 0)::NUMERIC AS avg_lecture_completion_percentage
    142146        FROM course c
    143147                 JOIN course_translate ct ON c.course_id = ct.course_id
    144148                 JOIN language l ON l.id = ct.language_id AND l.value = 'en'
    145149                 JOIN course_version cv ON c.course_id = cv.course_id
    146                  LEFT JOIN enrollment e ON cv.course_version_id = e.course_version_id   -- left join to include versions with zero enrollments
    147                  LEFT JOIN payment p ON e.enrollment_id = p.enrollment_id               -- left join to include enrollments without payments (because enrollment can be in trial)
    148                  LEFT JOIN review r ON e.enrollment_id = r.enrollment_id                -- left join to include enrollments without reviews
     150                 LEFT JOIN enrollment e ON cv.course_version_id = e.course_version_id   -- include versions with zero enrollments
     151                 LEFT JOIN payment p ON e.enrollment_id = p.enrollment_id               -- include enrollments without payments
     152                 LEFT JOIN review r ON e.enrollment_id = r.enrollment_id                -- include enrollments without reviews
     153                 LEFT JOIN lecture_progress lp ON lp.enrollment_id = e.enrollment_id    -- include enrollments with no progress rows
    149154        GROUP BY c.course_id, ct.course_translate_id, cv.course_version_id
    150         HAVING COUNT(DISTINCT e.enrollment_id) > 0
    151155        ORDER BY total_revenue DESC, completion_rate_percentage DESC;
    152156END;
     
    205209      total_enrollments ← COUNT(enrollment_id),
    206210      total_revenue ← COALESCE(SUM(amount), 0) (
    207       payment ⋈ enrollment_id = enrollment_id enrollment
     211      enrollment ⟕ enrollment_id = enrollment_id ∧ payment_status = 'completed' payment
    208212    )
    209213  )
     
    240244
    241245-- All time course specific, for each course version
     246lecture_progress ←
     247  γ enrollment_id;
     248    enrollment_id ← enrollment_id,
     249    completed_percentage ← COUNT(is_completed = true) * 100.0 / COUNT(*) (
     250    user_course_progress
     251  )
     252
    242253π course_id, course_name, course_description, course_difficulty, course_price, version_number, is_version_active, total_enrollments, paid_enrollments, trial_enrollments, total_completions, total_students, total_revenue, average_rating, total_reviews, avg_days_to_complete, completion_rate_percentage, avg_lecture_completion_percentage (
    243254  τ total_revenue DESC, completion_rate_percentage DESC (
    244     σ COUNT(DISTINCT e.enrollment_id) > 0 (
    245       γ c.course_id, ct.course_translate_id, cv.course_version_id;
    246         course_id ← c.course_id,
    247         course_name ← ct.title_short,
    248         course_description ← ct.description_short,
    249         course_difficulty ← c.difficulty,
    250         course_price ← c.price,
    251         version_number ← cv.version_number,
    252         is_version_active ← cv.is_active,
    253         total_enrollments ← COUNT(e.enrollment_id),
    254         paid_enrollments ← COUNT(CASE WHEN payment_status = 'completed' THEN e.enrollment_id END),
    255         trial_enrollments ← COUNT(CASE WHEN payment_id IS NULL THEN e.enrollment_id END),
    256         total_completions ← COUNT(CASE WHEN completion_date IS NOT NULL THEN e.enrollment_id END),
    257         total_students ← COUNT(DISTINCT e.user_id),
    258         total_revenue ← COALESCE(SUM(CASE WHEN payment_status = 'completed' THEN amount ELSE 0 END), 0),
    259         average_rating ← COALESCE(AVG(r.rating), 0),
    260         total_reviews ← COUNT(r.review_id),
    261         avg_days_to_complete ← ROUND(AVG(CASE WHEN completion_date IS NOT NULL THEN completion_date - activation_date END), 0),
    262         completion_rate_percentage ← ROUND(100.0 * COUNT(CASE WHEN completion_date IS NOT NULL THEN e.enrollment_id END) / NULLIF(COUNT(e.enrollment_id), 0), 2),
    263         avg_lecture_completion_percentage ← ROUND(AVG(COALESCE((SELECT COUNT(CASE WHEN is_completed = true THEN 1 END) * 100.0 / NULLIF(COUNT(*), 0) FROM user_course_progress WHERE enrollment_id = e.enrollment_id), 0)), 2)
    264       (
    265         course ⋈ course_id = course_id course_translate
    266         ⋈ language_id = id ∧ value = 'en' language
    267         ⋈ course_id = course_id course_version
    268         ⟕ course_version_id = course_version_id enrollment
    269         ⟕ enrollment_id = enrollment_id payment
    270         ⟕ enrollment_id = enrollment_id review
    271       )
     255    γ c.course_id, ct.course_translate_id, cv.course_version_id;
     256      course_id ← c.course_id,
     257      course_name ← ct.title_short,
     258      course_description ← ct.description_short,
     259      course_difficulty ← c.difficulty,
     260      course_price ← c.price,
     261      version_number ← cv.version_number,
     262      is_version_active ← cv.is_active,
     263      total_enrollments ← COUNT(e.enrollment_id),
     264      paid_enrollments ← COUNT(CASE WHEN payment_status = 'completed' THEN e.enrollment_id END),
     265      trial_enrollments ← COUNT(CASE WHEN payment_id IS NULL THEN e.enrollment_id END),
     266      total_completions ← COUNT(CASE WHEN completion_date IS NOT NULL THEN e.enrollment_id END),
     267      total_students ← COUNT(DISTINCT e.user_id),
     268      total_revenue ← COALESCE(SUM(CASE WHEN payment_status = 'completed' THEN amount ELSE 0 END), 0),
     269      average_rating ← COALESCE(AVG(r.rating), 0),
     270      total_reviews ← COUNT(r.review_id),
     271      avg_days_to_complete ← ROUND(AVG(CASE WHEN completion_date IS NOT NULL THEN completion_date - activation_date END), 0),
     272      completion_rate_percentage ← COALESCE(ROUND(100.0 * COUNT(CASE WHEN completion_date IS NOT NULL THEN e.enrollment_id END) / NULLIF(COUNT(e.enrollment_id), 0), 2), 0),
     273      avg_lecture_completion_percentage ← COALESCE(ROUND(AVG(lp.completed_percentage), 2), 0)
     274    (
     275      course ⋈ course_id = course_id course_translate
     276      ⋈ language_id = id ∧ value = 'en' language
     277      ⋈ course_id = course_id course_version
     278      ⟕ course_version_id = course_version_id enrollment
     279      ⟕ enrollment_id = enrollment_id payment
     280      ⟕ enrollment_id = enrollment_id review
     281      ⟕ enrollment_id = enrollment_id lecture_progress
    272282    )
    273283  )