mySql动态数据透视查询超过3000列

时间:2016-04-05 23:08:54

标签: mysql pivot-table

美好的一天, 我正在使用动态数据透视查询按月生成产品销售的交叉表。只有超过3K的产品,这意味着超过3k列。当我运行查询时,我收到一个错误。如果我将原始表中的行数限制在1586以下,它可以正常运行,输出为16 col,包括“date”字段。我想不出来,需要一些帮助!请参阅下面的代码和错误:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when PSHDSTK = ''',
      PSHDSTK,
      ''' then MthSales end) AS `',
      PSHDSTK,
      '`'
    )
  ) INTO @sql
FROM  salesbyrow;

SET @sql = CONCAT('SELECT thedate, ', @sql, ' 
                  FROM salesbyrow
                                    GROUP BY thedate');

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

我得到的错误是

[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM salesbyrow
                                    GROUP BY thedate' at line 2

2 个答案:

答案 0 :(得分:0)

在小样本上,一切似乎对我都很好。 您确定没有引号或某些内容可能会破坏@sql列中的PSHDSTK字符串吗?

在执行语句之前添加SELECT @sql以进行调试(如下所示)。

另外,请注意字符串变量和GROUP_CONCAT的MySQL最大大小。但是,在执行查询之前查看查询时,这应该会变得清晰。

如果GROUP_CONCAT最大长度是限制(默认为1024),则应更改临时设置(会话范围)的长度。它完成了:

SET SESSION group_concat_max_len = 10000 -- to set it to 10 000

样品:

create table salesbyrow(thedate int, PSHDSTK varchar(2), MthSales int);
insert into salesbyrow(thedate,PSHDSTK,MthSales) 
  values (1, 'a1', 6),(1, 'a2', 5), (1, 'a1', 3);

您的代码:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when PSHDSTK = ''',
      PSHDSTK,
      ''' then MthSales end) AS `',
      PSHDSTK,
      '`'
    )
  ) INTO @sql
FROM  salesbyrow;

SET @sql = CONCAT('SELECT thedate, ', @sql, ' FROM salesbyrow GROUP BY thedate');

完整性检查@sql变量:

select @sql;

声明如下(正确):

SELECT thedate, max(case when PSHDSTK = 'a1' then MthSales end) AS `a1`,max(case when PSHDSTK = 'a2' then MthSales end) AS `a2` FROM salesbyrow GROUP BY thedate

正在执行......

prepare stmt from @sql;
execute stmt;

结果:

thedate     a1  a2
1           6   5

答案 1 :(得分:0)

'考虑我'指示我导致错误的原因和另一个Stackoverflow帖子指示我解决方案。 stackoverflow.com/questions/2567000/... ;.所以我增加了SET SESSION group_concat_max_len,效果很好!无需额外编码。我刚补充说。

SET SESSION group_concat_max_len = 250000;

到查询的顶部。效果很好!我在这里相当新,所以我不能投票,考虑我'谁真的回答了造成这个问题的原因。