mysql根据条件将行转换为列

标签 mysql

是否可以通过这种方式将 mysql 行转换为列?

假设我有这样一张 table

+-----+--------------+---------+--------------+-------+
| id  | std_no       | exam_id | subject_code | score |
+-----+--------------+---------+--------------+-------+
|   1 | 1000         |       1 |          101 |    70 |
|   2 | 1000         |       1 |          102 |    75 |
|   3 | 1000         |       1 |          121 |    75 |
|   4 | 1000         |       1 |          231 |    69 |
|   7 | 1001         |       1 |          101 |    80 |
|   8 | 1001         |       1 |          102 |    70 |
|   9 | 1001         |       1 |          121 |    90 |
|  10 | 1001         |       1 |          231 |    80 |
| 127 | 1000         |       2 |          101 |    61 |
| 128 | 1000         |       2 |          102 |    85 |
| 129 | 1000         |       2 |          121 |    50 |
| 130 | 1000         |       2 |          231 |    54 |
| 133 | 1001         |       2 |          101 |    63 |
| 134 | 1001         |       2 |          102 |    14 |
| 135 | 1001         |       2 |          121 |    90 |
| 136 | 1001         |       2 |          231 |    25 |
+-----+--------------+---------+--------------+-------+

我需要根据上面的内容创建一个新表,如下所示:

+-----+----------------+-------------+-------+-------+
| id  | std_no         |subject_code | exam1 | exam2 |         
+-----+----------------+-------------+-------+-------+
| 1   | 1000           | 101         | 70    | 61    |
| 2   | 1000           | 102         | 75    | 85    |
| 3   | 1000           | 121         | 75    | 50    |
| 4   | 1000           | 231         | 69    | 54    |
| 5   | 1001           | 101         | 80    | 63    |
| 6   | 1001           | 102         | 70    | 14    |
| 7   | 1001           | 121         | 90    | 90    |
| 8   | 1001           | 231         | 80    | 25    |
+-----+----------------+-------------+-------+-------+

通过第一个表,获取std_nosubject_code分数。但是我需要把分数e inside table2 under exam1 if table1.exam_id=1 and in table2 under exam2 if table1.exam_id=2

用 mysql 可以吗?

最佳答案

对于动态exam_id,您需要创建一个动态查询来生成数据透视表,如下所示

set @sql = null;
select
  group_concat(distinct
    concat(
      'max(case when exam_id = ''',
      exam_id,
      ''' then score end) AS ',
      concat('exam',exam_id)
    )
  ) into @sql
from exam;

set @sql = concat('select std_no,subject_code, ', @sql, ' from exam 
                  group by std_no,subject_code
                  order by std_no,subject_code
');

prepare stmt from @sql;
execute stmt;
deallocate prepare stmt;

在预期的结果集中,您还有一些 id 递增顺序,要获得该顺序,您可以更改上述查询以使用用户定义的变量来实现相同的结果

set @sql = null;
select
  group_concat(distinct
    concat(
      'max(case when exam_id = ''',
      exam_id,
      ''' then score end) AS ',
      concat('exam',exam_id)
    )
  ) into @sql
from exam;

set @sql = concat('select @rn:=@rn+1 as id,std_no,subject_code, ', @sql, ' from exam,(select @rn:=0)x
                  group by std_no,subject_code
                  order by std_no,subject_code
');

prepare stmt from @sql;
execute stmt;
deallocate prepare stmt;

DEMO

关于mysql根据条件将行转换为列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30889349/

相关文章:

python - 如何使用 MariaDB 在 Django 中正确过滤 SIP 字符?

php - ModX 和 PDO : querying with PHP variables

mysql - 重置 MySQL root 密码无效

mysql - 通过不唯一的 id 将数据连接在一起

mysql - 具有多个列分组依据和 where 子句的每列的最新值

python - [Python]拆分csv文件的元素并插入mysql

mysql - 外键或空值

mysql - 在 openBSD 上 chroot Apache+MsSQL;无法确定服务器的完全限定域名

mysql - 尝试执行第一次迁移时获取 django.core.exceptions.ImproperlyConfigured : Error loading MySQLdb module,

set 语句中的 MySQL 脚本