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语句也可以通过一些临时表执行。问题是您必须根据表中的值动态创建查询字符串。即使使用临时表,也必须生成要执行的动态字符串