2

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

我的表如下所示:

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 之类的操作。

4

1 回答 1

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

于 2012-10-10T10:16:45.277 回答