MySQL 将不同的列转换为行

标签 mysql

我有一个大型数据集,其中包含每人一行,以及 25 个可能会或可能不会被填充的标准列,就像这个示例:

SELECT * FROM Criteria_Input;

╔══════════╦═══════════╦═══════════╦═══════════╦═══════════╦═══════════╦═══════════╗
║ Name     ║ Criteria1 ║ Criteria2 ║ Criteria3 ║ Criteria4 ║ Criteria5 ║ Criteria6 ║
╠══════════╬═══════════╬═══════════╬═══════════╬═══════════╬═══════════╬═══════════╣
║ Michael  ║           ║    Yes    ║           ║           ║    Yes    ║           ║
║ Brant    ║           ║           ║           ║           ║           ║    Yes    ║
║ Mary     ║    Yes    ║           ║           ║    Yes    ║           ║           ║
║ John     ║           ║           ║           ║           ║    Yes    ║           ║
║ Connie   ║           ║           ║    Yes    ║    Yes    ║           ║           ║
╚══════════╩═══════════╩═══════════╩═══════════╩═══════════╩═══════════╩═══════════╝

我需要将这些数据转换成这样的行:

SELECT * FROM Criteria_Final;

╔═════════╦═══════════╗
║ Name    ║ Criteria  ║
╠═════════╬═══════════╣
║ Michael ║ Criteria2 ║
║ Michael ║ Criteria5 ║
║ Brant   ║ Criteria6 ║
║ Mary    ║ Criteria1 ║
║ Mary    ║ Criteria4 ║
║ John    ║ Criteria5 ║
║ Connie  ║ Criteria3 ║
║ Connie  ║ Criteria4 ║
╚═════════╩═══════════╝

或者更好的是:

SELECT * FROM Criteria_Final;

╔═════════╦══════════╗
║ Name    ║ Criteria ║
╠═════════╬══════════╣
║ Michael ║     2    ║
║ Michael ║     5    ║
║ Brant   ║     6    ║
║ Mary    ║     1    ║
║ Mary    ║     4    ║
║ John    ║     5    ║
║ Connie  ║     3    ║
║ Connie  ║     4    ║
╚═════════╩══════════╝

这种数据转换在MySQL中可行吗?我需要进行这种转换的原因是我会将生成的表与标准编号上的另一个表连接起来。

最佳答案

尝试使用 UNION 查询 -

SELECT * FROM (
  SELECT name, 1 AS criteria FROM cr WHERE LENGTH(Criteria1) > 0
    UNION
  SELECT name, 2 AS criteria FROM cr WHERE LENGTH(Criteria2) > 0
    UNION
  SELECT name, 3 AS criteria FROM cr WHERE LENGTH(Criteria3) > 0
    UNION
  SELECT name, 4 AS criteria FROM cr WHERE LENGTH(Criteria4) > 0
    UNION
  SELECT name, 5 AS criteria FROM cr WHERE LENGTH(Criteria5) > 0
    UNION
  SELECT name, 6 AS criteria FROM cr WHERE LENGTH(Criteria6) > 0
) t
ORDER BY name, criteria

如果需要,更改 WHERE 条件以检查 NULL 值。

关于MySQL 将不同的列转换为行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32474548/

相关文章:

mysql - mysql中复杂的列计算以获得每月访问量

mysql - fatal error : Call to a member function query()on a non-object

mysql - 适合大数据的数据库设计

php - 如何在ubuntu 17.10中安装php5.5

mysql - 在 mysql 表 auto_increment 中创建一个 ID(事后)

php - 每 5 分钟从 mysql 更新一次的 jquery div 容器

php - 增加数据库中的字段

具有identity属性的MySQL语句

mysql - 在 Laravel5.4 中将数据插入数据透视表

php - MySQL BETWEEN 和 ">= AND <="给出不同的结果