数据透视表错误
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' 附近使用正确的语法
此错误是因为您的代码获取了列列表。由于您有一个名为 CASE
的 jp.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
等聚合函数。如果您希望将 Qty
与 PieceType
相加,那么您似乎想要使用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
【讨论】:
以上是关于数据透视表错误的主要内容,如果未能解决你的问题,请参考以下文章