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

如果我有一个类似以下内容的MySQL表:

公司名称操作页面计数
-------------------------------
A公司印刷品3
A公司印刷品2
A公司印刷品3
B公司电子邮件
B公司印刷品2
B公司印刷品2
B公司打印1
A公司印刷品3

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

公司名称电子邮件打印1页打印2页打印3页
-------------------------------------------------------------
公司01 3
公司B 1 1 2 0

其思想是,pagecount可以变化,因此输出列的数量应该反映这一点,每个action/pagecount对对应一列,然后是每个公司名称的点击次数。我不确定这是否称为透视表,但有人建议这样做

这基本上是一个透视表

有关如何实现这一点的教程,请参见:http://www.artfulsoftware.com/infotree/qrytip.php?id=78

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

更新

在上面的链接现在不再可用之后,我觉得有义务为所有在这里搜索mysql pivot答案的人提供一些额外的信息。它真的有大量的信息,我不会把所有的信息都放在这里(甚至更多,因为我不想复制他们的广博知识),但我将给出一些建议,说明如何以sql的方式处理数据透视表,通常以peku的例子为例,他首先提出了这个问题

也许链接很快就会回来,我会留意的

电子表格方式…

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

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

SQL方式…

考虑到他的桌子看起来像这样:

创建表'test\u pivot'(
`pid`bigint(20)非空自动增量,
`公司名称'varchar(32)默认为空,
`action`varchar(16)默认为空,
`pagecount`bigint(20)默认为空,
主键(`pid`)
)发动机=MyISAM;

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

公司名称电子邮件打印1页打印2页打印3页
-------------------------------------------------------------
公司01 3
公司B 1 1 2 0

行(电子邮件打印x页)类似于条件。主要分组方式为公司名称

为了设置条件,这相当于使用CASE-语句。为了按某物分组,那么,使用分组依据

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

选择P.`company\u name`,
计数(
案例
当P.`action`='EMAIL'
那么1
否则无效
终止
)作为"电邮",,
计数(
案例
当P.`action`='PRINT'和P.`pagecount`='1'
然后P.‘页面计数’
否则无效
终止
)作为“打印1页”,
计数(
案例
当P.`action`='PRINT'和P.`pagecount`='2'
然后P.‘页面计数’
否则无效
终止
)作为“打印2页”,
计数(
案例
当P.`action`='PRINT'和P.`pagecount`='3'
然后P.‘页面计数’
否则无效
终止
)作为“打印3页”
从测试P
按“公司名称”分组;

这将很快提供所需的结果。这种方法的主要缺点是,希望透视表中的行越多,需要在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/

发表评论