2016-11-10 62 views
2

我有同樣的情況,因爲我有在MySQL or PHP Transform rows to columnsmysql的MySQL或PHP變換行兩列動態

但是現在我必須調整自己的桌子,這是輸出

enter image description here

這是幾乎與上面的鏈接相同,但我包括AS_amount.anyone可以幫助我嗎?

我想要的結果,但以下用AS_month_2016 ...等在各FA_mont2016

enter image description here

右側這是我的代碼:

CREATE DEFINER=`root`@`localhost` PROCEDURE `display_annualize_table`() 
BEGIN 
SET group_concat_max_len=10028; 
SET @sql = NULL; 

SELECT GROUP_CONCAT(DISTINCT CONCAT(
     'MAX(IF(month = ''', 
     month, 
     ''' and year(date) = ', 
     year(date), 

     ', FS_amount, NULL)) AS `', 
     CONCAT('FA_',month), 
     '_', 
     year(date), 

     '`') 
    order by date 
) INTO @sql 
    FROM tmp_results; 

    if coalesce(@sql,'') != '' then 
    set @sql = concat(', ', @sql); 
    end if; 

    SET @sql = CONCAT(
    'SELECT r.account as Account, 
    r.region as Region ', 
    coalesce(@sql,''), 
    'FROM tmp_results r 
    LEFT JOIN accounts AS a 
    on r.account_id = a.id 
    GROUP BY r.account, r.region 
    ORDER By r.account_id'); 

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

需要你的幫助,請。先謝謝你!

+0

它們與我的代碼相同。 – Dhenn

+0

我提出了你的問題,謝謝你的努力。 –

回答

1

它的工作方式爲FS_amount相同,只需添加新的列到你的代碼生成的動態列:

SELECT GROUP_CONCAT(DISTINCT CONCAT(
     'MAX(IF(month = ''', 
     month, 
     ''' and year(date) = ', 
     year(date), 
     ', FS_amount, NULL)) AS `', 
     CONCAT('FA_',month), 
     '_', 
     year(date), 
     '`, ', 
     'MAX(IF(month = ''', 
     month, 
     ''' and year(date) = ', 
     year(date), 
     ', AS_amount, NULL)) AS `', 
     CONCAT('AS_',month), 
     '_', 
     year(date), 
     '`'  
    ) 
    order by date 
) INTO @sql 
    FROM tmp_results; 

你應該看看語句創建的代碼(例如,通過臨時增加一個select @sql;),但如果需要添加更多列,它應該非常簡單。

+0

嗨Solarflare,不幸的是我在運行時遇到了一個錯誤:錯誤代碼:1064.你的SQL語法有錯誤;檢查對應於您的MySQL服務器版本的手冊,以找到正確的語法,以便在第2行的'FA_November_202FROM tmp_results r LEFT JOIN帳戶AS a on r.accoun'處使用 – Dhenn

+0

哦,我想通了。我必須增加可能max_concat_len。謝謝哥們! :) – Dhenn