【问题标题】:Retrieve and format results from different tables从不同的表中检索和格式化结果
【发布时间】:2016-10-24 22:05:38
【问题描述】:

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

预期输出:

Section1、2、3、4 代表考试的第 1、2、3、4 部分的分数。 请注意,如果某个部分的分数为空,则应将其替换为零(000)。

最终输出表有列 - 分数,它是特定年份所有部分的分数的串联结果。 score1 表示 2016 年所有部分分数的串联结果。类似 score2 - 2015、score3 - 2014 等。

输出应该有两个人的 2 行 5 列 - 卷数,2016 年、2015 年、2014 年和 2013 年的连接部分分数。

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

感谢任何建议。谢谢。

【问题讨论】:

  • @Jens 感谢您帮助格式化表格。欣赏它。我试图遵循格式规则。我无法知道我在哪里做错了。
  • 将它们封装在代码块中。
  • 对不起,我不明白 section1、section2 等是什么...
  • @Jens 成功了。谢谢
  • 我认为一种方法是创建一个新的临时表复制 tbl_marks 表并向其添加一个额外的列,即 tbl_student 表的 sid。现在我们可以在按 sid 分组的部分分数(部分 1、部分 2 等)上使用 GROUP_CONCAT 和 concat。有什么想法,如果这是一个好方法,或者我们可以在不创建新表的情况下获得结果吗?

标签: mysql sql


【解决方案1】:

第一步: 加入

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

第二步: 选择大小写/何时

    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

我们正朝着正确的方向前进。

第三步: 最大和分组依据

我们需要将所有结果按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

最后一步:合并

    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

有了这个你应该得到预期的结果,我无法测试它所以我可能犯了一些错误,如果它不起作用,请发表评论。

【讨论】:

    猜你喜欢
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    相关资源
    最近更新 更多