I want to show a output like this,
+------------+--------------+---------------------+---------------+-----------+--------------+-----------+ | segment_id | segment_name | segment_description | tot_questions | tot_marks | marks_obtain | neg_marks | +------------+--------------+---------------------+---------------+-----------+--------------+-----------+ | 10006 | MCQ SECTION | | 5 | 20 | | -.5 | | 10007 | Non-MCQ | | 5 | 20 | | 0 | +------------+--------------+---------------------+---------------+-----------+--------------+-----------+
Now here are my tables that will be used for join,
MockTestMaster (used column tot_marks)
+---------+------------+-------------+-------------+ | test_id | test_name | total_Marks | template_id | +---------+------------+-------------+-------------+ | 1 | MOCKTEST-X | 20 | 1 | +---------+------------+-------------+-------------+
MockTestDetails (segment_id, segment_name, tot_questions)
+---------+------------+--------------+------------------------+ | test_id | section_id | section_name | total_section_question | +---------+------------+--------------+------------------------+ | 1 | 10006 | MCQ SECTION | 5 | | 1 | 10006 | MCQ SECTION | 5 | | 1 | 10006 | MCQ SECTION | 5 | | 1 | 10006 | MCQ SECTION | 5 | | 1 | 10006 | MCQ SECTION | 5 | | 1 | 10007 | Non-MCQ | 5 | | 1 | 10007 | Non-MCQ | 5 | | 1 | 10007 | Non-MCQ | 5 | | 1 | 10007 | Non-MCQ | 5 | | 1 | 10007 | Non-MCQ | 5 | +---------+------------+--------------+------------------------+
prd_template_question_type (used columns neg_marks)
+-------------+-------------+----------------+----------------+ | template_id | is_mcq_type | is_nonmcq_type | marks_if_wrong | +-------------+-------------+----------------+----------------+ | 1 | 1 | 0 | -0.5 | | 1 | 0 | 1 | 0 | +-------------+-------------+----------------+----------------+
prd_templatesection (I could use this table,but on my application user could add a section and which will not be inserted in this table because it will change the original template,so I inserted that section in MockTestDetails table)
+-------------+------------+--------------+------------------------+-------------------+ | template_id | section_id | section_name | total_section_question | sectiontype_isMcq | +-------------+------------+--------------+------------------------+-------------------+ | 1 | 10006 | MCQ SECTION | 5 | true | | 1 | 10007 | Non-MCQ | 5 | false | +-------------+------------+--------------+------------------------+-------------------+
Now problem of getting my output is the marks_if_wrong
column of prd_template_question_type
table.
Now here is the deal how to get neg_marks: if sectiontype_isMcq
of prd_templatesection
is true
, then grab marks_if_wrong
column of prd_template_question_type
.
I tried this query:
SELECT DISTINCT md.section_id AS segment_id, md.section_name AS segment_name, '' AS segment_description, md.total_section_question as tot_questions, total_Marks AS tot_marks, '' AS marks_obtain, '' AS neg_marks --prd_template_question_type.marks_if_wrong AS neg_marks FROM dbo.MocktestDetails md INNER JOIN dbo.MockTestMaster mm ON mm.test_id = md.test_id INNER JOIN prd_templatesection pts ON pts.template_id = mm.template_id WHERE mm.test_id = 1;
Here is a fiddle of this problem
Advertisement
Answer
You can use the following code
WITH cte_sales AS ( SELECT DISTINCT md.section_id AS segment_id, md.section_name AS segment_name, '' AS segment_description, md.total_section_question AS tot_questions, total_Marks AS tot_marks, '' AS marks_obtain, pts.template_id AS template_id --prd_template_question_type.marks_if_wrong AS neg_marks FROM dbo.MocktestDetails md INNER JOIN dbo.MockTestMaster mm ON mm.test_id = md.test_id INNER JOIN prd_templatesection pts ON pts.template_id = mm.template_id WHERE mm.test_id = 1 ) SELECT segment_id, segment_name, segment_description, tot_questions, tot_marks, marks_obtain, COALESCE( ( SELECT TOP 1 marks_if_wrong FROM prd_template_question_type AS ptqt JOIN prd_templatesection AS pt ON ptqt.template_id = pt.template_id WHERE ptqt.template_id = cte.template_id AND pt.section_id = cte.segment_id ), '0' ) FROM cte_sales AS cte