gpt4 book ai didi

mysql - 如何将不同 WHERE 条件下的数据排列到不同的列中?

转载 作者:行者123 更新时间:2023-12-01 00:50:54 25 4
gpt4 key购买 nike

我有一个包含 3 列(SID、SUBJECT、MARKS)的表:

╔══════╦═════════╦═══════╗
║ SID ║ SUBJECT ║ MARKS ║
╠══════╬═════════╬═══════╣
║ 1A01 ║ ENG ║ 66 ║
║ 1A02 ║ ENG ║ 75 ║
║ 1A01 ║ MATH ║ 60 ║
║ 1A03 ║ ENG ║ 73 ║
║ 1A02 ║ MATH ║ 35 ║
║ 1A03 ║ MATH ║ 80 ║
║ 1A01 ║ CHI ║ 65 ║
║ 1A02 ║ CHI ║ 74 ║
║ 1A03 ║ CHI ║ 78 ║
╚══════╩═════════╩═══════╝

我想按每行中的 SID 对数据进行分组,例如:

╔══════╦═════╦═════╦══════╗
║ SID ║ CHI ║ ENG ║ MATH ║
╠══════╬═════╬═════╬══════╣
║ 1A01 ║ 65 ║ 66 ║ 60 ║
║ 1A02 ║ 74 ║ 75 ║ 35 ║
║ 1A03 ║ 78 ║ 73 ║ 80 ║
╚══════╩═════╩═════╩══════╝

我是 mysql 的新手,我尝试使用子查询和 UNION 但失败了。谁能给我一些提示?

最佳答案

如果只有这 3 个主题,您可以使用 CASE 测试每个 SIDSubject 并使用 聚合结果>MAX().

SELECT  SID,
MAX(CASE WHEN Subject = 'Chi' THEN Marks ELSE NULL END) `Chi`,
MAX(CASE WHEN Subject = 'Eng' THEN Marks ELSE NULL END) `Eng`,
MAX(CASE WHEN Subject = 'Math' THEN Marks ELSE NULL END) `Math`
FROM TableName
GROUP BY SID

但是,如果您的主题数量未知,那么使用 PREPARE动态 SQL 是首选。

SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(CASE WHEN Subject = ''',
Subject,
''' then Marks end) AS ',
CONCAT('`', Subject,'`')
)
) INTO @sql
FROM TableName;

SET @sql = CONCAT('SELECT SID, ', @sql, '
FROM TableName
GROUP BY SID');

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

OUTPUT 来自两个查询

╔══════╦═════╦═════╦══════╗
║ SID ║ CHI ║ ENG ║ MATH ║
╠══════╬═════╬═════╬══════╣
║ 1A01 ║ 65 ║ 66 ║ 60 ║
║ 1A02 ║ 74 ║ 75 ║ 35 ║
║ 1A03 ║ 78 ║ 73 ║ 80 ║
╚══════╩═════╩═════╩══════╝

关于mysql - 如何将不同 WHERE 条件下的数据排列到不同的列中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15743734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com