数据透视表错误

Posted

技术标签:

【中文标题】数据透视表错误【英文标题】:Error with pivot table 【发布时间】:2015-07-10 09:07:46 【问题描述】:

我有一个 SQL 查询来显示有关公司的信息。其中一列称为 PieceType,一个公司可以有许多件类型,并且每种类型都有一个数量。所以我想将每种类型的类型显示为一列,然后是它下面的数量。所以每种类型都有自己的列。

所以它看起来像这样:

我在这里创建了一个示例数据库:http://www.sqlfiddle.com/#!9/13230/4

SET group_concat_max_len=4294967294;
SET @COLUMNS = NULL;

/* Build columns to pivot */

SELECT GROUP_CONCAT(
        DISTINCT CONCAT(
            'CASE WHEN jp.PieceType = "', 
            jp.PieceType ,
            '" THEN 1 ELSE NULL END AS ',
            jp.PieceType
        )
) INTO @COLUMNS
FROM job_pieces jp;

/* Build full query */
SET @SQL = CONCAT(
        'SELECT    
                c.Name,
                ',@COLUMNS'
        FROM customer c
        LEFT JOIN job_new jn ON c.JobID = jn.ID
        LEFT JOIN job_pieces jp ON c.JobID = jp.JobID
        WHERE c.Company_ID = 123
        GROUP BY c.ID'
);

/* Prepare and execute the query*/
PREPARE stmt FROM @SQL;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

但是当我运行查询时出现这个错误:

调用本机函数“CONCAT”时参数不正确

【问题讨论】:

【参考方案1】:

您的代码存在一些问题,导致了一些问题。

首先,设置@SQL 的代码缺少CONCAT 函数的逗号:

SET @SQL = CONCAT(
        'SELECT    
                c.Name,
                ',@COLUMNS, '
                       -- ^ this is missing  
        FROM customer c
        LEFT JOIN job_new jn ON c.JobID = jn.ID
        LEFT JOIN job_pieces jp ON c.JobID = jp.JobID
        WHERE c.Company_ID = 123
        GROUP BY c.Name'
);

添加逗号后,您将收到另一个错误:

您的 SQL 语法有错误;检查与您的 mysql 服务器版本相对应的手册,以在第 3 行的 'CASE,CASE WHEN jp.PieceType = "CTN" THEN 1 ELSE NULL END AS CTN,CASE WHEN jp.Pie' 附近使用正确的语法

此错误是因为您的代码获取了列列表。由于您有一个名为 CASEjp.PieceType 值,这是一个保留字,因此您的语法将失败。您需要转义列名的别名:

SELECT GROUP_CONCAT(
        DISTINCT CONCAT(
            'CASE WHEN jp.PieceType = ''', 
            jp.PieceType ,
            ''' THEN 1 ELSE NULL END AS `',
                                     -- ^ add this
            jp.PieceType, '`'
                     -- ^ add this after the comma
        )
) INTO @COLUMNS
FROM job_pieces jp;

这是一个sql fiddle,代码现在可以工作了。但是,我还必须注意,您在 CASE 表达式周围缺少一个聚合函数。通常,当您像这样 PIVOT 数据时,您会使用 MAX/MIN/SUM 等聚合函数。如果您希望将 QtyPieceType 相加,那么您似乎想要使用SUM,所以你的代码是:

SET group_concat_max_len=4294967294;
SET @COLUMNS = NULL;


/* Build columns to pivot */
SELECT GROUP_CONCAT(
        DISTINCT CONCAT(
            'SUM(CASE WHEN jp.PieceType = ''', 
            jp.PieceType ,
            ''' THEN jp.QTY ELSE 0 END) AS `',
            jp.PieceType, '`'
        )
) INTO @COLUMNS
FROM job_pieces jp;

/* Build full query */
SET @SQL = CONCAT(
        'SELECT    
                c.Name,
                ',@COLUMNS, '
        FROM customer c
        LEFT JOIN job_new jn ON c.JobID = jn.ID
        LEFT JOIN job_pieces jp ON c.JobID = jp.JobID
        WHERE c.Company_ID = 123
        GROUP BY c.Name'
);

/* Prepare and execute the query*/
PREPARE stmt FROM @SQL;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

见SQL Fiddle with Demo

【讨论】:

以上是关于数据透视表错误的主要内容,如果未能解决你的问题,请参考以下文章

数据透视表错误

比较数据透视表中计算字段中的两列错误

laravel 多对多关系不存储在数据透视表中

当我尝试在 laravel 中更新数据透视表的内容时,有啥方法可以解决非法偏移类型错误

从数据透视表缓存重新创建源数据

ABAP 内表数据汇总问题 求助