我正在尝试获取如下结果集:
chartday username [number of results]
2014-12-12 person3 73
2014-12-12 person2 9
2014-12-12 person4 166
2014-12-12 person1 103
2014-12-12 person5 1
2014-12-12 person6 168
2014-12-13 person2 15
2014-12-13 person7 22
2014-12-13 person1 119
我希望结果如下所示:
chartday person1 person2 person3 person4 person5 person6 person7
2014-12-12 103 9 73 166 1 168 0
2014-12-13 119 15 0 0 0 0 22
我正在使用 mySQL,并且已经为此工作了一段时间,并且想要一些想法。这是我一直在使用的一个示例:SQLFiddle ,但我不知道如何添加 count(*) 来返回信息。
最佳答案
您可以使用条件聚合:
SELECT chartday
,MAX(CASE WHEN username = 'person1' THEN CT ELSE 0 END) AS Person1
,MAX(CASE WHEN username = 'person2' THEN CT ELSE 0 END) AS Person2
,MAX(CASE WHEN username = 'person3' THEN CT ELSE 0 END) AS Person3
,MAX(CASE WHEN username = 'person4' THEN CT ELSE 0 END) AS Person4
,MAX(CASE WHEN username = 'person5' THEN CT ELSE 0 END) AS Person5
,MAX(CASE WHEN username = 'person6' THEN CT ELSE 0 END) AS Person6
,MAX(CASE WHEN username = 'person7' THEN CT ELSE 0 END) AS Person7
FROM Table1
GROUP BY chartday
演示:SQL Fiddle
要使这种动态化,您必须使用准备好的语句:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(IF(username = ''',
username,
''', ct, 0)) AS ',
username
)
) INTO @sql
FROM Table1;
SET @sql = CONCAT('SELECT chartday, ', @sql, ' FROM Table1 GROUP BY chartday');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
演示:SQL Fiddle2
关于mysql - 使用 count(*) 创建动态数据透视表查询 mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27462745/