2015-07-10 120 views
0

我有一个SQL查询来显示有关公司的信息。其中一列叫做PieceType,一家公司可以有很多种类型,每种类型都有数量。所以我想要将每件作品的类型显示为一列,然后显示其中的数量。所以每种类型都有自己的专栏。数据透视表错误

因此,这将是这样的:

enter image description here

我已经在这里创造的样本数据库: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; 

但是当我运行查询,我得到这个错误:

Incorrect parameters in the call to native function 'CONCAT'

回答

0

你有几个问题,你的代码塔t导致一些问题。

首先,设置@SQL代码缺少一个逗号为CONCAT function`:

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' 
); 

一旦你添加一个逗号,你会得到另一个错误:

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 'CASE,CASE WHEN jp.PieceType = "CTN" THEN 1 ELSE NULL END AS CTN,CASE WHEN jp.Pie' at line 3

此错误因为你的代码得到列的列表。由于您有一个jp.PieceTypeCASE这是一个保留字,您的语法失败。你需要躲避别名的列名:

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