如果我有一个类似以下内容的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/