【问题标题】:SO's answers to dynamic pivoting causes 'Error in SQL Synthax'SO 对动态旋转的回答导致“SQL 语法错误”
【发布时间】: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:无论我使用三个、两个还是一个引号,错误消息都不会改变。还有什么建议吗?

标签: mysql dynamic pivot


【解决方案1】:

我发现在“用户”列中有一个条目是“1”,它产生了错误。

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

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 让我使用 fiddle 进行错误再现!

【讨论】:

    猜你喜欢
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多