mysql - 如何在 MySQL 中返回数据透视表输出?

如果我的 MySQL 表看起来像这样:

company_name    action  pagecount
-------------------------------
Company A       PRINT   3
Company A       PRINT   2
Company A       PRINT   3
Company B       EMAIL   
Company B       PRINT   2
Company B       PRINT   2
Company B       PRINT   1
Company A       PRINT   3

是否可以运行 MySQL 查询以获得如下输出:

company_name    EMAIL   PRINT 1 pages   PRINT 2 pages   PRINT 3 pages
-------------------------------------------------------------
CompanyA        0       0               1               3
CompanyB        1       1               2               0

这个想法是 pagecount 可以变化,因此输出列的数量应该反射(reflect)这一点,每个 action/pagecount 对对应一列,然后每个 company_name 的点击次数。我不确定这是否称为数据透视表,但有人建议这样做?

最佳答案

这基本上一个数据透视表。

可以在此处找到有关如何实现此目的的精彩教程:http://www.artfulsoftware.com/infotree/qrytip.php?id=78

我建议阅读这篇文章并根据您的需求调整此解决方案。

更新

在上面的链接目前不再可用之后,我觉得有义务为所有在这里搜索 mysql pivot 答案的人提供一些额外的信息。它确实有大量的信息,我不会把那里的所有东西都放在这里(甚至更多,因为我只是不想复制他们的大量知识),但我会就如何处理枢轴提供一些建议用首先提出问题的 peku 的示例来概括 sql 方式。

也许链接很快就会恢复,我会留意它。

电子表格方式...

许多人只是为此目的使用 MSExcel、OpenOffice 或其他电子表格工具等工具。这是一个有效的解决方案,只需复制那里的数据并使用 GUI 提供的工具来解决这个问题。

但是...这不是问题所在,它甚至可能导致一些缺点,例如如何将数据放入电子表格、有问题的缩放等等。

SQL 方式...

鉴于他的 table 看起来像这样:

CREATE TABLE `test_pivot` (
  `pid` bigint(20) NOT NULL AUTO_INCREMENT,
  `company_name` varchar(32) DEFAULT NULL,
  `action` varchar(16) DEFAULT NULL,
  `pagecount` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`pid`)
) ENGINE=MyISAM;

现在查看他/她想要的表:

company_name    EMAIL   PRINT 1 pages   PRINT 2 pages   PRINT 3 pages
-------------------------------------------------------------
CompanyA        0       0               1               3
CompanyB        1       1               2               0

行(EMAILPRINT x pages)类似于条件。主要分组是按company_name

为了设置条件,这里宁愿使用 CASE -陈述。为了按某事分组,好吧,使用... GROUP BY

提供此数据透视的基本 SQL 可能如下所示:

SELECT  P.`company_name`,
    COUNT(
        CASE 
            WHEN P.`action`='EMAIL' 
            THEN 1 
            ELSE NULL 
        END
    ) AS 'EMAIL',
    COUNT(
        CASE 
            WHEN P.`action`='PRINT' AND P.`pagecount` = '1' 
            THEN P.`pagecount` 
            ELSE NULL 
        END
    ) AS 'PRINT 1 pages',
    COUNT(
        CASE 
            WHEN P.`action`='PRINT' AND P.`pagecount` = '2' 
            THEN P.`pagecount` 
            ELSE NULL 
        END
    ) AS 'PRINT 2 pages',
    COUNT(
        CASE 
            WHEN P.`action`='PRINT' AND P.`pagecount` = '3' 
            THEN P.`pagecount` 
            ELSE NULL 
        END
    ) AS 'PRINT 3 pages'
FROM    test_pivot P
GROUP BY P.`company_name`;

这应该会很快提供所需的结果。这种方法的主要缺点是,您希望数据透视表中的行越多,您需要在 SQL 语句中定义的条件就越多。

这也可以处理,因此人们倾向于使用准备好的语句、例程、计数器等。

有关此主题的一些附加链接:

  • http://anothermysqldba.blogspot.de/2013/06/pivot-tables-example-in-mysql.html
  • http://www.codeproject.com/Articles/363339/Cross-Tabulation-Pivot-Tables-with-MySQL
  • http://datacharmer.org/downloads/pivot_tables_mysql_5.pdf
  • https://codingsight.com/pivot-tables-in-mysql/

https://stackoverflow.com/questions/7674786/

相关文章:

mysql - 我应该如何解决 MySQL 中的 --secure-file-priv 问题?

mysql - 错误 2006 (HY000) : MySQL server has gone aw

mysql - 我应该使用什么列类型/长度将 Bcrypt 散列密码存储在数据库中?

MySQL - 如何按字符串长度选择数据

mysql - 在 MySQL 数据库的每个表的字段中搜索文本

mysql - 在性能开始下降之前 MySQL 数据库可以有多大

mysql - 如何设置 MySQL 的时区?

mysql - 如何更改 max_allowed_pa​​cket 大小

mysql - 对于 Homebrew mysql 安装,my.cnf 在哪里?

mysql - 表 'performance_schema.session_variables' 不