Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 显示按列数据_Mysql - Fatal编程技术网

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不支持的功能,但是如果您事先知道要透视到列中的数据范围,那么您可以做的就是将行数据透视到单独的列中


您有两个选择: 您的示例具有ABC,用于
课程
,每个
用户ID->模块
组合。假设
课程
中的值只能是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 
您可以根据需要添加任意数量的
案例
聚合(对于DEF等)。请记住,一些
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