限制MYSQL透视表

时间:2016-10-21 07:54:47

标签: mysql pivot-table

问题:

如何限制MYSQL数据透视表上显示/生成的列数?

我的设置:

我有一个名为“updates”的表,如下所示:

updates table

我有以下查询片段(这只是查询的一部分,整个事情只会从其他表中添加更多列,但这是唯一可以转动的部分):

SET @sql = NULL;

SELECT
   GROUP_CONCAT(DISTINCT
     CONCAT(
       'MAX(IF(Date = ''',
       Date,
       ''', Description, NULL)) AS ',
       CONCAT("'",Date_Format(Date, '%d/%m/%Y'),"'")
     )
   )INTO @sql
FROM updates;

SET @sql = CONCAT('SELECT Action, ', @sql, ' FROM updates GROUP BY Action');

PREPARE stmt FROM @sql;
EXECUTE stmt;

此查询的结果如下:

enter image description here

正如您所看到的,这会将表格按预期进行调整,并将日期作为列。但是,这些更新(对于操作)有可能在它们“关闭”并且不显示之前变得很长。因此,我想将结果限制为最新的3次更新。但是......没有按行动,因为这可能仍会在数据透视表中给我很多更新。

我希望从更新表中获取最新的3个日期,并保留每个日期的所有更新,保留此数据透视表格式。

示例:上面的结果表看起来相同,但标题为“02/10/2016”和“04/10/2016”的列除外。

提前感谢您的任何帮助或建议。

1 个答案:

答案 0 :(得分:0)

对于其他任何试图解决此问题的人,我设法使用以下查询来产生所需的结果:

SET @sql = NULL;

SELECT
   GROUP_CONCAT(DISTINCT
     CONCAT(
       'MAX(IF(Date = ''',
       Date,
       ''', Description, NULL)) AS ',
       CONCAT("'",Date_Format(Date, '%d/%m/%Y'),"'")
     ) ORDER BY Date ASC 
   ) INTO @sql
FROM (
    SELECT * FROM updates
    GROUP BY Date
    ORDER BY Date DESC
    LIMIT 2)
    AS updates;

SET @sql = CONCAT('SELECT Action, ', @sql, ' FROM updates GROUP BY Action');

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