2014-09-22 94 views
1

我有這個疑問它具有以下的輸出:構建動態透視查詢在MySQL

SELECT o.date  AS Date, 
     u.firstname AS FirstName, 
     u.lastname AS LastName, 
     m.name  AS MealName 
FROM catering.user u 
     LEFT JOIN catering.order o 
       ON u.iduser = o.iduser 
     LEFT JOIN catering.meal m 
       ON m.idmeal = o.idmeal 
WHERE o.weeknumber = 37 
GROUP BY u.firstname, 
      o.date 
ORDER BY o.date; 

enter image description here

我需要的是編寫一個查詢得到以下的輸出: enter image description here

我跟着與動態數據透視查詢相關的其他帖子,但MySql是我的一個新話題,我無法弄清楚如何在我的情況下使用準備好的語句?

錯誤消息我得到的是:

PREPARE stmt FROM @sql Error Code: 1064. 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 'NULL' at line 1  

我使用MySQL工作臺6.0 CE

+0

有多少不同的名字,你呢? – Mihai 2014-09-22 09:23:09

+0

@Mihai我有超過30個不同的名字 – laura 2014-09-22 09:24:28

+0

@Mihai我在運行查詢時遇到以下錯誤:'PREPARE stmt FROM @sql \t錯誤代碼:1064.您的SQL語法錯誤;第1行\t 0.000秒,查看與您的MySQL服務器版本相對應的手冊,以便在'SELECT date,SELECT date,MAX(CASE WHEN u.firstname ='john'THEN m.name END) ' – laura 2014-09-22 18:00:37

回答

0
SET SESSION group_concat_max_len = 1000000; 

SET @sql = NULL; 
SELECT 
GROUP_CONCAT(DISTINCT 
    CONCAT(
     'MAX(CASE WHEN firstname= ''', 
     firstname, 
     ''' THEN mealName END) AS ', 
     firstname 
    ) 
    )INTO @sql 
FROM 
(SELECT o.date  AS Date, 
     u.firstname AS FirstName, 
     u.lastname AS LastName, 
     m.name  AS MealName 
FROM catering.user u 
     LEFT JOIN catering.order o 
       ON u.iduser = o.iduser 
     LEFT JOIN catering.meal m 
       ON m.idmeal = o.idmeal 
WHERE o.weeknumber = 37 
GROUP BY u.firstname, 
      o.date 
ORDER BY o.date)x; 



SET @sql=CONCAT('SELECT date,',@sql,' FROM 
(SELECT o.date  AS Date, 
     u.firstname AS FirstName, 
     u.lastname AS LastName, 
     m.name  AS MealName 
FROM catering.user u 
     LEFT JOIN catering.order o 
       ON u.iduser = o.iduser 
     LEFT JOIN catering.meal m 
       ON m.idmeal = o.idmeal 
WHERE o.weeknumber = 37 
GROUP BY u.firstname, 
      o.date 
ORDER BY o.date)x 
GROUP BY date'); 


PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

FIDDLE