我正在尝试创建一个新表,该表使用现有表中一行(整个列)中的值并将其转换为列。
我希望它像INSERT INTO … SELECT DISTINCT
那样工作以填充列,但是要使结果成为表的新列。
现在我要创建行的列中的值是:
001-2018年6月
002-2018年7月
003-2018年8月
…
013-2019年6月
但是,我不能仅仅对其进行硬编码,因为我希望随着更多月份的添加(2019年7月等)来运行它们
我想要一个表中的列与行同名的表,因为我试图将每月的效果与其他变量进行比较,例如哪个用户每月驾驶的次数最多。
到目前为止,从这里以前的答案开始,我尝试创建一个可以执行以创建表的字符串。
select @s:=concat('create table students_col (',group_concat(driving_month,' CHAR(100)' order by driving_month),')') from new_drivers;
prepare statement from @s;
execute statement;
deallocate prepare statement;
但是,尽管MySQL Workbench没有红色下划线,但是除了选择连接的语句之外,我还为每个语句获取了错误代码。
错误代码:1064。您的SQL语法有错误;请在第1行的'2018年6月CHAR(100),2018年7月CHAR(100),2018年8月CHAR(100)'附近检查与MySQL服务器版本相对应的手册以使用正确的语法
错误代码:1243。已将未知的预准备语句处理程序(语句)提供给EXECUTE
错误代码:1243。赋予DEALLOCATE PREPARE的未知的准备好的语句处理程序(语句)
当我单独使用@s
运行查询时,一切正常,并且不知道语法错误在哪里。
我愿意采取任何更好的方法。我只希望能够轻松地创建表格,其中月份会自动创建为行。不幸的是,为了使事情与其他信息保持一致,我不能只从字符串中提取月份和年份,所以我也需要001、002...。
答案 0 :(得分:0)
由于driving_month
包含空格,因此需要在其周围加上反引号以创建列名。
select @s:=concat('create table students_col (',group_concat('`', driving_month,'` CHAR(100)' order by driving_month),')') from new_drivers;