MySQL动态数据透视表

我试图获得一个带有动态列的数据透视表。当user_id是一个字符串时,它可以正常工作,但是如果它是一个int,那么它似乎会失败

到目前为止,在过去的问题帮助下,我得到的是:

CREATE TABLE measure2

(`inspection_date` date, `user_id` int, `score` int, comment text)

;

INSERT INTO measure2

(`inspection_date`, `user_id`, `score`, comment)

VALUES

('2012-10-16', 0, 0, null),

('2012-10-16', 1, 0, null),

('2012-10-16', 2, 0, null),

('2012-10-16', 3, 0, null),

('2012-10-17', 0, 1, null),

('2012-10-17', 1, 1, null),

('2012-10-17', 2, 1, null),

('2012-10-18', 3, 1, null)

;

SET @sql = NULL;

SELECT

GROUP_CONCAT(DISTINCT

CONCAT(

'max(case when user_id = ''',

user_id,

''' then score end) AS ',

user_id

)

) INTO @sql

FROM measure2;

SET @sql = CONCAT('SELECT inspection_date, ', @sql, '

FROM measure2

GROUP BY inspection_date');

PREPARE stmt FROM @sql;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

参见:http :

//sqlfiddle.com/#!2/eab24/1

我确定这很简单,但是我想念什么呢?

谢谢

回答:

由于值在int其中,因此您要将它们设为列名,因此必须将值包装在反引号中

该SQL将看起来像:

max(case when user_id = 1 then score end) as `1`

完整的查询将是:

SET @sql = NULL;

SELECT

GROUP_CONCAT(DISTINCT

CONCAT(

'max(case when user_id = ''',

user_id,

''' then score end) AS `',

user_id, '`'

)

) INTO @sql

FROM measure2;

SET @sql = CONCAT('SELECT inspection_date, ', @sql, '

FROM measure2

GROUP BY inspection_date');

PREPARE stmt FROM @sql;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

参见带有演示的SQL Fiddle

以上是 MySQL动态数据透视表 的全部内容, 来源链接: utcz.com/qa/398121.html

回到顶部