如果我有一个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
可以变化,因此输出列数量应该反映出来,每个 action
/ _ pagecount
对一列,然后每个 company_name
点击次数 . 我不确定这是否被称为数据透视表,但有人建议?
8 回答
对于动态数据透视,请使用
GROUP_CONCAT
和CONCAT
. GROUP_CONCAT函数将一个组中的字符串连接成一个带有各种选项的字符串 .DEMO HERE
有一个名为MySQL Pivot表生成器的工具,它可以帮助您创建基于Web的数据透视表,以后可以导出到excel(如果您愿意) . 如果您的数据位于单个表或多个表中,它可以工作 .
您需要做的就是指定列的数据源(它支持动态列),行,表的主体中的值和表关系(如果有的话)
该工具的主页是http://mysqlpivottable.net
正确的答案是:
这基本上是一个数据透视表 .
有关如何实现这一目标的精彩教程可以在这里找到:http://www.artfulsoftware.com/infotree/qrytip.php?id=78
我建议阅读这篇文章,并根据您的需求调整此解决方案 .
Update
在上面的链接目前不再可用之后,我觉得有必要为在这里搜索mysql数据库答案的所有人提供一些额外的信息 . 它真的有大量的信息,我不会把这里的所有东西放在这里(更多因为我只是不想复制他们丰富的知识),但我会就如何处理枢轴给出一些建议以sql的方式表示一般来自peku的例子,他们首先提出问题 .
也许链接很快就会回来,我会留意它 .
The spreadsheet way...
许多人只是使用MSExcel,OpenOffice或其他电子表格工具之类的工具来实现此目的 . 这是一个有效的解决方案,只需复制那里的数据并使用GUI提供的工具来解决这个问题 .
但是......这不是问题,它甚至可能导致一些缺点,例如如何将数据导入电子表格,有问题的缩放等等 .
The SQL way...
鉴于他的表看起来像这样:
现在看看他/她想要的表格:
行(
EMAIL
,PRINT x pages
)类似于条件 . 主要分组是company_name
.为了设置条件,这相当大声地使用CASE -statement . 为了分组,好吧,使用...
GROUP BY
.提供此pivot的基本SQL可能如下所示:
这应该非常快速地提供所需的结果 . 这种方法的主要缺点是,您在数据透视表中需要的行越多,您需要在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
http://buysql.com/mysql/14-how-to-automate-pivot-tables.html
我的解决方案是在没有任何支点的T-SQL中:
使用boolean logic的 stardard-SQL 版本:
SQL Fiddle.
怎么样?
TRUE OR NULL
收益TRUE
.FALSE OR NULL
收益NULL
.NULL OR NULL
收益NULL
.并且COUNT仅计算非空值 . 瞧 .
对于MySQL,您可以直接在
SUM()
函数中输入条件,它将被评估为布尔0
或1
,因此您可以根据您的条件计算您的计数,而无需使用IF/CASE
语句DEMO