Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.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_Pivot - Fatal编程技术网

mysql中的行到列转换

mysql中的行到列转换,mysql,pivot,Mysql,Pivot,下面是我的表结构,我想将其转换为另一种格式(从行到列类型),我已经尝试了很多次,但我不能这样做 StudentID | Mark | Subject ------------------------- 10 |46 |Java -------------------------- 10 |65 |C# -------------------------- 10 |79 |JavaScript ----------------------

下面是我的表结构,我想将其转换为另一种格式(从行到列类型),我已经尝试了很多次,但我不能这样做

StudentID | Mark | Subject
-------------------------
10        |46    |Java
--------------------------
10        |65    |C#
--------------------------
10        |79    |JavaScript
---------------------------
11        |66    |Java
--------------------------
11        |85    |C#
--------------------------
11        |99    |JavaScript
--------------------------
O/p应为:

StudentID | Java | C# | JavaScript
---------------------------------
10        |  46  | 65 |   79
---------------------------------
11        |  66  | 85 |  99
-------------------------------

这种类型的数据转换称为枢轴。MySQL没有pivot函数,因此您需要使用带有
CASE
表达式的聚合函数来转换数据

如果您提前知道要转换的值,则可以对其进行硬编码,如下所示:

select studentid,
  sum(case when subject = 'Java' then mark else 0 end) Java,
  sum(case when subject = 'C#' then mark else 0 end) `C#`,
  sum(case when subject = 'JavaScript' then mark else 0 end) JavaScript
from yourtable
group by studentid

如果主题的值未知或灵活,则可能需要使用准备好的语句生成动态sql:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'sum(case when subject = ''',
      subject,
      ''' then mark else 0 end) AS `',
      subject, '`'
    )
  ) INTO @sql
FROM  yourtable;

SET @sql = CONCAT('SELECT studentid, ', @sql, ' 
                  from yourtable
                  group by studentid');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

两个查询的结果都是:

| STUDENTID | JAVA | C# | JAVASCRIPT |
--------------------------------------
|        10 |   46 | 65 |         79 |
|        11 |   66 | 85 |         99 |

“已经尝试了很多,但无法做到”你尝试了什么?你这样做有什么问题?请提供更多详细信息。您应该检查pivot表:谢谢您的回答,但我正在寻找通用表,而不是通过harcoding“JAVA”或“C#”代码自动选择…@PrabhatShankar我只是添加了一个动态版本。请参阅我的编辑谢谢,不使用prepared语句也可以通过一些临时表执行。问题是您必须根据表中的值动态创建查询字符串。即使使用临时表,也必须生成要执行的动态字符串