| 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 |
| 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 |