0

我的数据库中有数据

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
4

1 回答 1

2

您要完成的是将PIVOT行数据“ ing”到单独的列中,这是 MySQL 不支持的功能,但是如果您事先知道要旋转的数据范围,您可以做的是伪造它成列。


你有几个选择:

您的示例具有ABCcourse每个userid -> module组合。假设 in 中的值course只能是ABC:您可以对每个值进行条件聚合,如下所示:

  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需要添加任意数量的聚合(对于DEF等)。请记住,某些userid -> module组合可能具有NULL某些列,例如,如果它不包含带有Cfor的行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

这会输出如下内容:

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

这是两个选项的SQL-Fiddle 演示


编辑:根据您的评论和编辑,这是新的解决方案:

SELECT 
    a.userid, 
    a.module, 
    CONCAT('Course ', course, ': ', total) AS Courses, 
    b.grade
FROM
    tbl a
INNER JOIN
(
    SELECT userid, module, SUM(total) AS grade
    FROM tbl 
    GROUP BY userid, module
) b ON a.userid = b.userid AND a.module = b.module
于 2012-07-14T05:12:39.193 回答