我有一张调查数据表,其中结果行分为多行,每行都有自己的变量名。
我的表格如下:
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。
答案 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;