mysql - 使用 count(*) 创建动态数据透视表查询 mysql

标签 mysql sql report pivot

我正在尝试获取如下结果集:

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/

相关文章:

PHP 尝试在 while 循环中向数组添加值

c# - 在 ASP.NET C# 页面转到不同页面时在后台运行存储过程

sql - PostgreSQL 多列 WHERE = ANY(ARRAY)

pdf - 删除 Rmarkdown 中 PDF 报告的章节标题

MySQL 比较 unix 时间戳

java - 使用具有字符串的额外列将数据从一个 Mysql 表传输到另一个表

Javascript ADO 记录集打开方法不起作用。参数化查询

xml - Odoo10如何在Qweb Report中显示图片?

c# - 如何在表达式窗口(本地报表)中引用文本框的值?

php - 选择不返回任何内容/php - mysql