显示列明智的数据

时间:2012-07-14 04:51:45

标签: mysql

我的数据库中有数据

userid    module      course     total
  8      Biophysics     A          117
  8      BioPhysics     B           74
  8      BioPhysics     C          135

我需要像

这样的输出
userid      module       Courses        grade   
 8        BioPhysics    Course A: 117    250
                        Course B: 134  
                        Course C: 35

1 个答案:

答案 0 :(得分:2)

您要完成的工作称为“PIVOT”行数据到单独的列中,这是MySQL不支持的功能,但您可以做什么如果您事先知道要转移到列中的数据范围,则


您有几个选择:

您的示例包含{strong> A , B C courseuserid -> module组合。假设course中的值只能是 A B C :您可以执行条件聚合< / em>对于每个值如此:

  SELECT userid,
         module,
         MAX(CASE course WHEN 'A' THEN total END) AS A,
         MAX(CASE course WHEN 'B' THEN total END) AS B,
         MAX(CASE course WHEN 'C' THEN total END) AS C,
         SUM(total) AS grade
    FROM tbl
GROUP BY userid, 
         module 

您可以根据需要添加任意数量的CASE聚合( D E F 等)。请注意,对于某些列,某些userid -> module组合可能会NULL,例如,它不包含C的{​​{1}}行。

但如果您 事先知道值的范围(也许course可能有数百个不同的值,您仍然可以获得所有值将数据放在一行中,但它不在单独的列中 - 它实际上是一列中的一个串联字符串。这是通过使用course完成的:

GROUP_CONCAT()

这样做会输出类似:

  SELECT userid,
         module,
         GROUP_CONCAT(CONCAT(course, ': ', total) SEPARATOR ' / ') AS coursetotals,
         SUM(total) AS grade
    FROM tbl
GROUP BY userid,
         module

以下是两个选项的SQL-Fiddle Demo


修改:根据您的评论和编辑,以下是新的解决方案:

userid  |  module      |  coursetotals             |  grade
-------------------------------------------------------------
8       |  BioPhysics  |  A: 117 / B: 74 / C: 135  |  326