2012-12-01 30 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

相关问题