diff --git a/dal/db_query/queries.sql b/dal/db_query/queries.sql index 6a29cb1..1859c04 100644 --- a/dal/db_query/queries.sql +++ b/dal/db_query/queries.sql @@ -478,3 +478,86 @@ FROM ResultStats rs ON tb.time_interval = rs.time_interval LEFT JOIN AvTimeStats at ON tb.time_interval = at.time_interval; + +-- name: QuestionsStatistics :many +WITH Funnel AS ( + SELECT + COUNT(DISTINCT session) FILTER (WHERE a.start = FALSE) AS count_start_false, + COUNT(DISTINCT session) FILTER (WHERE a.start = TRUE) AS count_start_true, + COUNT(DISTINCT CASE WHEN a.result = FALSE AND qid_true_result IS NOT NULL THEN session END) AS count_f_result_with_t_question, + COUNT(DISTINCT CASE WHEN a.start = TRUE AND qid_true_result IS NULL THEN session END) AS count_t_start_with_t_question, + COUNT(DISTINCT session) FILTER (WHERE a.result = TRUE) AS count_t_result + FROM + answer a + LEFT JOIN ( + SELECT DISTINCT a.session, q.id AS qid_true_result + FROM answer a + JOIN question q ON a.question_id = q.id + WHERE a.result = TRUE + ) AS q ON a.session = q.session + WHERE + a.quiz_id = $1 + AND a.created_at >= TO_TIMESTAMP($2) + AND a.created_at <= TO_TIMESTAMP($3) +), + Results AS ( + SELECT + q.title AS question_title, + COUNT(*)::FLOAT / NULLIF(SUM(COUNT(*)) FILTER (WHERE a.result = TRUE), 0) AS percentage + FROM + answer a + JOIN + question q ON a.question_id = q.id + WHERE + a.quiz_id = $1 + AND a.created_at >= TO_TIMESTAMP($2) + AND a.created_at <= TO_TIMESTAMP($3) + AND a.result = TRUE + GROUP BY + q.id, q.title + HAVING + COUNT(*) >= 1 + ), + Questions AS ( + SELECT + q.title AS question_title, + a.content AS answer_content, + COUNT(*)::FLOAT / NULLIF(q.total_answers, 0) AS percentage + FROM + answer a + JOIN ( + SELECT q.id, COUNT(*) AS total_answers + FROM question q + JOIN answer a ON q.id = a.question_id + WHERE a.quiz_id = $1 + AND a.created_at >= TO_TIMESTAMP($2) + AND a.created_at <= TO_TIMESTAMP($3) + GROUP BY q.id + ) q ON a.question_id = q.id + WHERE + a.quiz_id = $1 + AND a.created_at >= TO_TIMESTAMP($2) + AND a.created_at <= TO_TIMESTAMP($3) + GROUP BY + q.id, q.title, a.content + HAVING + COUNT(*) >= 1 + ) +SELECT + Funnel.count_start_false, + Funnel.count_start_true, + Funnel.count_f_result_with_t_question, + Funnel.count_t_start_with_t_question, + Funnel.count_t_result, + Funnel.count_start_true, + Results.question_title AS results_question_title, + Results.percentage AS results_percentage, + Questions.question_title AS questions_question_title, + Questions.answer_content AS questions_answer_content, + Questions.percentage AS questions_percentage +FROM + Funnel, + Results, + Questions; + +