2015-07-10 117 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