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
可以改变,所以输出列的数量应该反映出来,每个action
/ pagecount
对的一列,然后每个company_name
的命中数。 我不确定这是否被称为数据透视表,但有人建议?
这基本上是一个数据透视表。
关于如何实现这个的一个很好的教程可以在这里找到:http://www.artfulsoftware.com/infotree/qrytip.php?id=78
我建议阅读这篇文章,并根据您的需求调整此解决方案。
更新
在上面的链接目前不可用的时候,我觉得有必要为你们所有人在这里搜索mysql pivot答案提供一些额外的信息。 它真的有大量的信息,我不会把所有的东西放在这里(甚至更多,因为我不想复制他们的知识),但我会给出一些关于如何处理透视的建议以一开始就问问题的peku为例,一般列举sql方式。
也许链接很快就会回来,我会留意它的。
电子表格的方式...
许多人只是使用像MSExcel,OpenOffice或其他电子表格工具这样的工具来达到这个目的。 这是一个有效的解决方案,只需在那里复制数据并使用GUI提供的工具来解决这个问题。
但是......这不是问题,它甚至可能导致一些缺点,如如何将数据导入电子表格,有问题的缩放等等。
SQL的方式...
鉴于他的桌子看起来像这样:
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
行( EMAIL
, PRINT 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语句中定义的条件越多。
这也可以处理,因此人们倾向于使用准备好的陈述,例程,计数器等。
关于此主题的一些其他链接:
我的解决方案是在没有任何支点的T-SQL中:
SELECT
CompanyName,
SUM(CASE WHEN (action='EMAIL') THEN 1 ELSE 0 END) AS Email,
SUM(CASE WHEN (action='PRINT' AND pagecount=1) THEN 1 ELSE 0 END) AS Print1Pages,
SUM(CASE WHEN (action='PRINT' AND pagecount=2) THEN 1 ELSE 0 END) AS Print2Pages,
SUM(CASE WHEN (action='PRINT' AND pagecount=3) THEN 1 ELSE 0 END) AS Print3Pages
FROM
Company
GROUP BY
CompanyName
对于MySQL,您可以直接将条件放在SUM()
函数中,并且它将被评估为布尔型0
或1
,因此您可以根据您的标准进行计数,而无需使用IF/CASE
语句
SELECT
company_name,
SUM(action = 'EMAIL')AS Email,
SUM(action = 'PRINT' AND pagecount = 1)AS Print1Pages,
SUM(action = 'PRINT' AND pagecount = 2)AS Print2Pages,
SUM(action = 'PRINT' AND pagecount = 3)AS Print3Pages
FROM t
GROUP BY company_name
DEMO
链接地址: http://www.djcxy.com/p/63773.html
上一篇: MySQL pivot table