GROUP BY用作列的行上的某个值

时间:2012-10-10 09:57:18

标签: php mysql group-by pivot

我有一张调查数据表,其中结果行分为多行,每行都有自己的变量名。

我的表格如下:

data_id  data_content   var_name          var_line
1        1              SERIAL            1
2        2              GND.AGE           1
3        3              GND.NEWS.FREQ     1
4        2              SERIAL            2
5        3              GND.AGE           2
6        3              GND.NEWS.FREQ     2
7        3              SERIAL            3
8        3              GND.AGE           3
9        4              GND.NEWS.FREQ     3

这是我当前的查询,用于检索GND.NEWS.FREQ的每个可能答案的答案总数。如总数:

SELECT *, COUNT(*) as total
  FROM `data`
 WHERE `var_name` = 'GND.NEWS.FREQ'
 GROUP BY `data_content`

现在我需要添加功能只返回其中GND.AGE为3的答案。所以基本上将var_line = 1的所有行都视为一行。

我查找了数据透视表,但我不确定如何将其添加到我当前的查询中。

如果可能的话,我想在一个查询中执行此操作,但我不介意做一些事情,比如在单独的查询中获取var_line ID。

1 个答案:

答案 0 :(得分:2)

不幸的是,MySQL没有PIVOT功能,这基本上就是你要做的。因此,您需要使用带有CASE语句的聚合函数。如果您要将未知数量的var_name值转换为列,则可以使用预准备语句:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when var_name = ''',
      var_name,
      ''' then var_line end) AS ',
      replace(var_name, '.', '_')
    )
  ) INTO @sql
FROM data;

SET @sql = CONCAT('SELECT data_content,', @sql, ' 
                  from data
                  group by data_content
                  ');

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

请参阅SQL Fiddle with Demo