Mysql 显示按列数据
我的数据库中有一个数据Mysql 显示按列数据,mysql,Mysql,我的数据库中有一个数据 userid module course total 8 Biophysics A 117 8 BioPhysics B 74 8 BioPhysics C 135 我需要像这样的输出 userid module Courses grade 8 BioPhysics
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
您试图实现的是将行数据透视到单独的列中,这是MySQL不支持的功能,但是如果您事先知道要透视到列中的数据范围,那么您可以做的就是将行数据透视到单独的列中
您有两个选择: 您的示例具有A、B和C,用于
课程
,每个用户ID->模块
组合。假设课程
中的值只能是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
您可以根据需要添加任意数量的案例
聚合(对于D、E、F等)。请记住,一些userid->module
组合可能对某些列具有NULL
,例如,如果它不包含course
的C
行
但是如果您事先不知道值的范围(对于课程
,可能有数百个不同的值,您仍然可以将所有数据放在一行中,但它不会在单独的列中-它实际上是单个列中的一个串联字符串。这是通过使用GROUP_CONCAT()
实现的:
这将产生如下输出:
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
这称为
PIVOT
,这在MySQL中是不可能的,但如果您事先知道需要多少列(例如course
的范围是否仅为a-C?)嗨,赞恩,我们能拿出课程表A:117和下一行B:74以及下一行C:135@ronquiq你是什么意思?你想让这些值在他们自己的行上吗?赞恩边-你能建议我按我需要输出的顺序显示课程吗above@ronquiq当然,只有一件事…117+74+135!=250r这仅仅是一个例子吗?Zane Bien-你能为我最近发布的问题“使用提交按钮插入数据-PHP,MySQL”提供任何解决方案吗
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