MySQL 动态地将行转为列
Posted
技术标签:
【中文标题】MySQL 动态地将行转为列【英文标题】:MySQL pivot row to column dynamically 【发布时间】:2016-08-02 12:59:03 【问题描述】:我有桌子:天
id | jour
1 Lundi 01 Août 2016
2 Mardi 02 Août 2016
3 Mercredi 03 Août 2016
4 Jeudi 04 Août 2016
我想要输出 50 行,例如:
Lundi 01 Août 2016 Mardi 02 Août 2016 Mercredi 03 Août 2016
1 2 3
【问题讨论】:
所以您希望将一个月中的每一天都转为单独的列?我认为您将需要动态 SQL,如果没有其他原因,每个月可以有可变的天数。 mysql pivot row into dynamic number of columns的可能重复 【参考方案1】:您可以轻松使用此查询:首先生成查询,然后将其作为准备好的语句执行。
SET SESSION group_concat_max_len = 1000000;
SELECT
CONCAT('SELECT ',
GROUP_CONCAT(
CONCAT (
"MAX(IF(`jour` = '",jour,'\',id,NULL)) AS `',jour,'`'
)
),
' FROM `day`'
) INTO @SQL
FROM
( SELECT *
FROM `day`
ORDER BY id
LIMIT 1,2
) AS data;
select @SQL; -- see the query only for debug
PREPARE stmt FROM @SQL;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
样本
MariaDB [yourSchema]> select * from day;
+----+------------------------+
| id | jour |
+----+------------------------+
| 1 | Lundi 01 Août 2016 |
| 2 | Mardi 02 Août 2016 |
| 3 | Mercredi 03 Août 2016 |
| 4 | Jeudi 04 Août 2016 |
+----+------------------------+
4 rows in set (0.00 sec)
MariaDB [yourSchema]> SELECT
-> CONCAT('SELECT ',
-> GROUP_CONCAT(
-> CONCAT (
-> "MAX(IF(`jour` = '",jour,'\',id,NULL)) AS `',jour,'`'
-> )
-> ),
-> ' FROM `day`'
-> ) INTO @SQL
-> FROM `day`;
Query OK, 1 row affected (0.00 sec)
MariaDB [yourSchema]> PREPARE stmt FROM @SQL;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
MariaDB [yourSchema]> EXECUTE stmt;
+---------------------+---------------------+------------------------+---------------------+
| Lundi 01 Août 2016 | Mardi 02 Août 2016 | Mercredi 03 Août 2016 | Jeudi 04 Août 2016 |
+---------------------+---------------------+------------------------+---------------------+
| 1 | 2 | 3 | 4 |
+---------------------+---------------------+------------------------+---------------------+
1 row in set (0.00 sec)
MariaDB [yourSchema]> DEALLOCATE PREPARE stmt;
Query OK, 0 rows affected (0.00 sec)
MariaDB [yourSchema]>
【讨论】:
PREPARE stmt FROM @SQL give error #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“NULL”附近使用正确的语法 @Sunil Dabhi - 在第一次查询之前执行此 SET SESSION group_concat_max_len = 1000000;。生成的字符串可能会比默认值更长。 @Sunil Dabhi - 你能发布 select @SQL 的输出吗?执行它而不是 PREPARE 来查看生成的查询。我输入了我的答案 我可以在这个查询中添加限制为 0、50 和按 id 排序吗? @Bernd Buffen 也许你可以帮助我。看看这个:***.com/questions/51832979/…以上是关于MySQL 动态地将行转为列的主要内容,如果未能解决你的问题,请参考以下文章
如何将行旋转为列,并按过去 7 天显示 - SQL SERVER