您要完成的是将PIVOT
行数据“ ing”到单独的列中,这是 MySQL 不支持的功能,但是如果您事先知道要旋转的数据范围,您可以做的是伪造它成列。
你有几个选择:
您的示例具有A、B和C的course
每个userid -> module
组合。假设 in 中的值course
只能是A、B或C:您可以对每个值进行条件聚合,如下所示:
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
for的行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
编辑:根据您的评论和编辑,这是新的解决方案:
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