2012-12-01 28 views
0

我想在MySQL中生成一個交叉表查詢。我用group_concat,但它不工作。我發出下面的查詢生成今年的榜單:mysql group_concat輸出作爲另一個查詢列表

set @v1 = (SELECT GROUP_CONCAT(DISTINCT 
CONCAT('\\nsum(CASE WHEN myear=\"', myear ,'\" 
THEN amount ELSE NULL END) AS\"', myear,'\"')) AS column_list 
FROM mdata 
where myear > 1972 and myear < 1974); 
select myear, amount, @v1 from mdata; 

,它產生的@v1但與二進制領域多年的列表。我想在我的下一個查詢中使用它來進行交叉表查詢。

我可以使用PHP運行第一個查詢並將值存儲在變量中,並在下一個查詢中使用它,但是如何在MySQL中完成?

+1

請出示您的表格和預期產出。 :) – bonCodigo

回答

1

你必須prepare要執行從SQL語句:

SET @v1 = (
    SELECT CONCAT(' 
    SELECT myear, amount, ', 
      GROUP_CONCAT(DISTINCT CONCAT(
      'SUM(CASE WHEN myear=', QUOTE(myear), ' THEN amount END) 
       AS `', REPLACE(myear, '`', '``'), '`' 
      )), ' 
    FROM mdata' 
) 
    FROM mdata 
    WHERE myear > 1972 AND myear < 1974 
); 

PREPARE stmt FROM @v1; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
+0

以上解決方案不工作給予錯誤「給予DEALLOCATE PREPARE未知的準備好的語句處理程序(stmt)」第二我試圖設置變量,然後發出選擇$ v1其返回null。我的數據是這樣的..我的表格結構acode,金額,年我只是想顯示交叉表數據,如acode 1972年1973年1972年....在年份標題顯示金額..在哪裏條款來休息一年將不會適用顯示與表格一樣多的年份 – user1480032

+0

@ user1480032:像[this](http://sqlfiddle.com/#!2/8fe04/1/2)?雖然有人想知道爲什麼,在這種情況下,你不會簡單地做[this](http://sqlfiddle.com/#!2/8fe04/2/0)? – eggyal

+0

我認爲你誤解了我的請求..我有你提到的表格我希望顯示在行acode的交叉表報告和每年的每列數量的意思,如果我有10年的數據,那麼它會顯示10列每年... – user1480032

相關問題