在mysql中选择动态列
是否可以像这样遍历表: mysql> select * from `stackoverflow`.`Results`; +--------------+---------+-------------+--------+ | ID | TYPE | CRITERIA_ID | RESULT | +--------------+---------+-------------+--------+ | 1 | car | env | 1 | | 2 | car | gas | | | 3 | car | age | | | 4 | bike | env | 1 | | 5 | bike | gas | | | 6 | bike | age | 1 | | 7 | bus | env | 1 | | 8 | bus | gas | 1 | | 9 | bus | age | 1 | +--------------+---------+-------------+--------+ 9 rows in set (0.00 sec)在mysql中选择动态列,mysql,sql,pivot,Mysql,Sql,Pivot,是否可以像这样遍历表: mysql> select * from `stackoverflow`.`Results`; +--------------+---------+-------------+--------+ | ID | TYPE | CRITERIA_ID | RESULT | +--------------+---------+-------------+--------+ | 1 | car | env |
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'SUM(IF(CRITERIA_ID = ''',
CRITERIA_ID,
''', RESULT, NULL)) AS ',
CRITERIA_ID
)
) INTO @sql
FROM
Results;
SET @sql = CONCAT('SELECT type, ', @sql, ' FROM Results GROUP BY type');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
不幸的是,MySQL没有一个
PIVOT
函数,这基本上就是您想要做的。因此,您需要将聚合函数与CASE
语句一起使用:
SELECT type,
sum(case when criteria_id = 'env' then result end) env,
sum(case when criteria_id = 'gas' then result end) gas,
sum(case when criteria_id = 'age' then result end) age
FROM results
group by type
看
现在,如果您希望动态执行此操作,这意味着您无法提前知道要转置的列,那么您应该阅读以下文章:
您的代码如下所示:
mysql> select * from `stackoverflow`.`Results`;
+--------------+---------+-------------+--------+
| ID | TYPE | CRITERIA_ID | RESULT |
+--------------+---------+-------------+--------+
| 1 | car | env | 1 |
| 2 | car | gas | |
| 3 | car | age | |
| 4 | bike | env | 1 |
| 5 | bike | gas | |
| 6 | bike | age | 1 |
| 7 | bus | env | 1 |
| 8 | bus | gas | 1 |
| 9 | bus | age | 1 |
+--------------+---------+-------------+--------+
9 rows in set (0.00 sec)
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'SUM(IF(CRITERIA_ID = ''',
CRITERIA_ID,
''', RESULT, NULL)) AS ',
CRITERIA_ID
)
) INTO @sql
FROM
Results;
SET @sql = CONCAT('SELECT type, ', @sql, ' FROM Results GROUP BY type');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
参见+1,了解准备好的报表的实施情况。动态SQL可能被低估了。警告:不能在函数或触发器中使用。的可能重复