问题:

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

我的设置:

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

mysql - 限制MYSQL数据透视表中显示的列-LMLPHP

我有以下查询片段(这只是查询的一部分,整个过程只会添加来自其他表的更多列,但这是唯一得到透视的部分):

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;


该查询的结果如下:

mysql - 限制MYSQL数据透视表中显示的列-LMLPHP

如您所见,这使表以预期的日期为中心旋转。但是,这些更新(对操作)有可能在“关闭”而不显示之前变得很长。因此,我想将结果限制为最新的3个更新。但是..不是每个动作,因为这可能仍会在数据透视表中给我很多更新。

我想从更新表中获取最近的3个日期,每个日期的所有更新都保持此数据透视表格式。

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

在此先感谢您的协助或建议。

最佳答案

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

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;

关于mysql - 限制MYSQL数据透视表中显示的列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40171184/

10-13 06:24