因此,动态旋转的答案会导致SQL Synthax中出现错误'

时间:2014-07-28 19:35:25

标签: mysql dynamic pivot

我已尝试过关于动态旋转的每个拟合答案,并且在执行代码时我总是会遇到以下错误:

  

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      

我尝试逐位执行查询,这样就会出现'prepare'-line错误:

  

QueryException:您的SQL语法中有错误;查看与您的MySQL服务器版本对应的手册,以便在'1 FROM eee_alltime GROUP BY mon'附近使用正确的语法   在第7行   查询是:sql:'PREPARE stmt FROM @sql;

任何人都知道我做错了什么?

我在同一个数据库上的表(不是视图)上尝试了代码,它也无法工作,我无法在Fiddle上重现错误。

1 个答案:

答案 0 :(得分:1)

我发现在'user'列中,一个条目为'1',产生错误。

@avisheks:我能够在fiddle中重现错误并通过在select语句中添加where子句来解决,因为我只希望列出包含'user'的用户名:

SET @sql = NULL;
SELECT GROUP_CONCAT(
    DISTINCT CONCAT('MAX(case when user = ''', user, ''' then hours end)
    AS ', user))
    INTO @sql
    FROM my_table WHERE user LIKE '%user%';

SET @sql = CONCAT('SELECT day , ', @sql, '
    FROM my_table
    GROUP BY day');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

看看fiddle。 非常感谢avisheks和bluefeet让我使用小提琴进行错误复制!