这基本上是一个数据透视表 .
我建议阅读这篇文章,并根据您的需求调整此解决方案 .
Update
在上面的链接目前不再可用之后,我觉得有必要为在这里搜索mysql数据库答案的所有人提供一些额外的信息 . 它真的有大量的信息,我不会把这里的所有东西放在这里(更多因为我只是不想复制他们丰富的知识),但我会就如何处理枢轴给出一些建议以sql的方式表示一般来自peku的例子,他们首先提出问题 .
也许链接很快就会回来,我会留意它 .
The spreadsheet way...
许多人只是使用MSExcel,OpenOffice或其他电子表格工具之类的工具来实现此目的 . 这是一个有效的解决方案,只需复制那里的数据并使用GUI提供的工具来解决这个问题 .
但是......这不是问题,它甚至可能导致一些缺点,例如如何将数据导入电子表格,有问题的缩放等等 .
The SQL way...
鉴于他的表看起来像这样:
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 -statement . 为了分组,好吧,使用... GROUP BY .
提供此pivot的基本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语句中定义的条件就越多 .
这也可以处理,因此人们倾向于使用准备好的语句,例程,计数器等 .
关于此主题的一些其他链接: