我的数据库中有数据
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
答案 0 :(得分:2)
您要完成的工作称为“PIVOT
”行数据到单独的列中,这是MySQL不支持的功能,但您可以做什么如果您事先知道要转移到列中的数据范围,则 假 。
您的示例包含{strong> A , B 和 C ,course
每userid -> 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
修改:根据您的评论和编辑,以下是新的解决方案:
userid | module | coursetotals | grade
-------------------------------------------------------------
8 | BioPhysics | A: 117 / B: 74 / C: 135 | 326