【发布时间】:2014-09-20 02:16:47
【问题描述】:
我已经尝试了所有关于动态旋转的合适答案,但在一次执行代码时总是出现以下错误:
QueryException:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 'SET @sql = CONCAT('SELECT day , ', @sql, ' FROM my_table GROUP BY day'); 附近使用正确的语法。 ' 在第 6 行
我正在使用安装了 MYSQL 5.1.63 的 Amazon AWS,我准备好的语句是以下代码:
SET @sql = NULL;
SELECT GROUP_CONCAT(
DISTINCT CONCAT('MAX(case when user = ''', user, ''' then hours end)
AS ', user))
INTO @sql
FROM my_table;
SET @sql = CONCAT('SELECT day , ', @sql, '
FROM my_table
GROUP BY day');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
我的观点是这样的:
day user task hours
monday user1 wash 3
monday user2 clean 2
monday user3 iron 4
tuesday user1 clean 4
tuesday user2 iron 1
tuesday user3 wash 3
并且应该动态地转向这个:
day user1 user2 user3
monday 3 2 4
tuesday 4 1 3
我尝试过一点一点地执行查询,这样错误就会出现在“准备”行中:
QueryException:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在“1 FROM eee_alltime GROUP BY mon”附近使用的正确语法 在第 7 行 查询是: sql : 'PREPARE stmt FROM @sql;
有人知道我做错了什么吗?
我在同一个数据库的表(不是视图)上尝试了代码,但它也不起作用,我无法在 Fiddle 上重现错误。
【问题讨论】:
-
您使用的语法似乎是 MySQL,但您已经用 MySQL 和 SQL Server 标记了它。你用的是什么数据库?我还建议先将查询编写为静态版本,然后将其转换为动态 SQL 以确保语法正确。这将有助于解决一些问题。
-
我认为这与这一行有关:DISTINCT CONCAT('MAX(case when user = ''', user, ''' then hours end), 你在两边都使用了额外的引号。
-
@juergen d:感谢编辑。
-
@bluefeet 我已经在我的previous post 中编写了一个静态版本的透视表。但老实说,这并不能解决问题。
-
@avisheks:无论我使用三个、两个还是一个引号,错误消息都不会改变。还有什么建议吗?