mysql group_concat输出为另一个查询列列表

时间:2012-12-01 07:22:34

标签: mysql crosstab

我想在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 个答案:

答案 0 :(得分: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;