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

标签 mysql sql select pivot

我有一个包含 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/

相关文章:

mysql - 如何在 MySQL 中排序子查询?

android - android BottomNavigationView中的项目选择颜色

select - Sparql 仅选择类的一个标签和注释

mysql - dbUploadTemplate [pkg-monitor] 上的 R 包 monitoR 错误

php - 带有子查询的 Doctrine Update 查询

sql - 如何在Hive中提取小数部分

python - 只获取 Pandas 数据框中其他属性不同值的第一行?

mysql - SELECT date BETWEEN dates with interval 日期

sql - 我的查询有多糟糕?

java - 使用struts2从hibernate获取数据的问题