我有一个大型数据集,其中包含每人一行,以及 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/