2016-10-13 2 views
0

tbl_marks:Получить и результаты формата из разных таблиц

+-------+-----------+-----------+-----------+-----------+----------+ 
|examid | section1 | section2 | section3 | section4 | year | 
+-------+-----------+-----------+-----------+-----------+----------+ 
|E1  |  100 |  101 |  102 |  103 | 2016 | 
|E2  |  200 |  201 |  202 |  203 | 2015 | 
|E3  |  300 |  301 |  302 |  303 | 2014 | 
|E4  |   |   |   |   | 2013 | 
|E5  |  400 |  401 |  402 |  403 | 2016 | 
|E6  |  500 |  501 |  502 |  503 | 2015 | 
|E7  |  600 |  601 |  602 |  603 | 2014 | 
|E8  |   |  701 |   |  703 | 2013 | 
+-------+-----------+-----------+-----------+-----------+----------+ 

tbl_student:

+-------+-----+---------+ 
|name | sid | rollnum | 
+-------+-----+---------+ 
|cheery | 1 |  X1 | 
|apple | 2 |  X2 | 
+-------+-----+---------+ 

tbl_exam:

+--------+------+ 
|examnum | sid | 
+--------+------+ 
|  E1 | 1 | 
|  E2 | 1 | 
|  E3 | 1 | 
|  E4 | 1 | 
|  E5 | 2 | 
|  E6 | 2 | 
|  E7 | 2 | 
|  E8 | 2 | 
+--------+------+ 

Ожидаемые результаты:

Раздел1, 2, 3, 4 представляют десятки ction1, 2, 3, 4 экзамена. Обратите внимание, что если оценка секции равна нулю, ее следует заменить нулями (000).

Итоговый выходной стол имеет столбец - баллы, которые объединены в результате оценки всех разделов того или иного года. score1 представляют собой объединенный результат всех секций десятки 2016 года. Аналогично счет2 - 2015, счет 3 - 2014 и т. д.

Вывод должен иметь 2 строки для двух человек с 5 колонками - число рулонов, объединенных разделов 2016, 2015, 2014 и 2013.

+------+------------+-------------+-------------+-------------+ 
| num | score1 | score2  | score3  | score4 | 
+------+------------+-------------+-------------+-------------+ 
| X1 |100101102103| 200201202203| 300301302303| 000000000000| 
| X2 |400401402403| 500501502503| 600601602603| 000702000703| 
+------+------------+-------------+-------------+-------------+ 

Любые предложения приветствуются. Спасибо.

+0

@Jens Спасибо за помощь в формате таблицы. Ценить это. Я пытался следовать правилам формата. Я не могу получить, где я делаю неправильно. – newuser

+0

Инкапсулируйте их в кодовые блоки. – Jens

+0

Извините, но я не понимаю, что такое section1, section2 и т. Д. –

ответ

0

первый шаг: Регистрация

SELECT * 
FROM tbl_student t_s 
LEFT JOIN tbl_exam t_e ON t_e.sid = t_s.sid 
LEFT JOIN tbl_marks t_m ON t_m.examid = t_e.examnum 

2-й шаг: Выбрать с футляром/когда

SELECT t_s.rollnum as "num", 
     CASE 
      WHEN t_m.year = '2016' THEN CONCAT_WS('',t_m.section1, t_m.section2, t_m.section3, t_m.section4) 
     END AS score1, 
     CASE 
      WHEN t_m.year = '2015' THEN CONCAT_WS('',t_m.section1, t_m.section2, t_m.section3, t_m.section4) 
     END AS score2, 
     CASE 
      WHEN t_m.year = '2014' THEN CONCAT_WS('',t_m.section1, t_m.section2, t_m.section3, t_m.section4) 
     END AS score3, 
     CASE 
      WHEN t_m.year = '2013' THEN CONCAT_WS('',t_m.section1, t_m.section2, t_m.section3, t_m.section4) 
     END AS score4 
    FROM tbl_student t_s 
    LEFT JOIN tbl_exam t_e ON t_e.sid = t_s.sid 
    LEFT JOIN tbl_marks t_m ON t_m.examid = t_e.examnum 

Мы получаем в правильном направлении здесь.

третий шаг: MAX & GROUP BY

Нам нужно сгруппировать все результат по rollnum, поэтому все остальные выбранные колонки должны быть агрегатные функции.

SELECT t_s.rollnum as "num", 
     MAX(CASE 
      WHEN t_m.year = '2016' THEN CONCAT_WS('',t_m.section1, t_m.section2, t_m.section3, t_m.section4) 
     END AS) score1, 
     MAX(CASE 
      WHEN t_m.year = '2015' THEN CONCAT_WS('',t_m.section1, t_m.section2, t_m.section3, t_m.section4) 
     END) AS score2, 
     MAX(CASE 
      WHEN t_m.year = '2014' THEN CONCAT_WS('',t_m.section1, t_m.section2, t_m.section3, t_m.section4) 
     END) AS score3, 
     MAX(CASE 
      WHEN t_m.year = '2013' THEN CONCAT_WS('',t_m.section1, t_m.section2, t_m.section3, t_m.section4) 
     END) AS score4 
    FROM tbl_student t_s 
    LEFT JOIN tbl_exam t_e ON t_e.sid = t_s.sid 
    LEFT JOIN tbl_marks t_m ON t_m.examid = t_e.examnum 
    GROUP BY num 

Последний шаг: Coalesce

SELECT t_s.rollnum as "num", 
     MAX(CASE 
      WHEN t_m.year = '2016' THEN CONCAT_WS('',COALESCE(t_m.section1,'000'), COALESCE(t_m.section2,'000'), COALESCE(t_m.section3,'000'), COALESCE(t_m.section4,'000')) 
     END AS) score1, 
     MAX(CASE 
      WHEN t_m.year = '2015' THEN CONCAT_WS('',COALESCE(t_m.section1,'000'), COALESCE(t_m.section2,'000'), COALESCE(t_m.section3,'000'), COALESCE(t_m.section4,'000')) 
     END) AS score2, 
     MAX(CASE 
      WHEN t_m.year = '2014' THEN CONCAT_WS('',COALESCE(t_m.section1,'000'), COALESCE(t_m.section2,'000'), COALESCE(t_m.section3,'000'), COALESCE(t_m.section4,'000')) 
     END) AS score3, 
     MAX(CASE 
      WHEN t_m.year = '2013' THEN CONCAT_WS('',COALESCE(t_m.section1,'000'), COALESCE(t_m.section2,'000'), COALESCE(t_m.section3,'000'), COALESCE(t_m.section4,'000')) 
     END) AS score4 
    FROM tbl_student t_s 
    LEFT JOIN tbl_exam t_e ON t_e.sid = t_s.sid 
    LEFT JOIN tbl_marks t_m ON t_m.examid = t_e.examnum 
    GROUP BY num 

При этом вы должны получить результат и следовало ожидать, я не могу проверить это, так что я, возможно, сделал какие-то ошибки, оставьте комментарий, если он Безразлично» т работы.

Смежные вопросы