1. 背景
* 由于MySQL 不支持类型Oracle与SQL Server的pivot功能进行行列转换。

2. 表与数据
mysql> select * from t_temp;
+---------+-----------+------------+
| year | season | orderCount |
+---------+-----------+------------+
| 2010年 | 一季度 | 100 |
| 2010年 | 二季度 | 200 |
| 2010年 | 三季度 | 300 |
| 2010年 | 四季度 | 400 |
| 2011年 | 一季度 | 150 |
| 2011年 | 二季度 | 300 |
| 2011年 | 三季度 | 450 |
| 2011年 | 四季度 | 600 |
+---------+-----------+------------+
8 rows in set (0.00 sec)
3. 通过子查询与case when判断实现
mysql> select year, sum(orderCount1) '第一季度',
-> sum(orderCount2) '第二季度',
-> sum(orderCount3) '第三季度',
-> sum(orderCount4) '第四季度'
-> from
-> (
-> select year,
-> case when season = '一季度' then
-> orderCount
-> end orderCount1,
-> case when season = '二季度' then
-> orderCount
-> end orderCount2,
-> case when season = '三季度' then
-> orderCount
-> end orderCount3,
-> case when season = '四季度' then
-> orderCount
-> end orderCount4
-> from t_temp
-> ) t
-> group by year;
+---------+--------------+--------------+--------------+--------------+
| year | 第一季度 | 第二季度 | 第三季度 | 第四季度 |
+---------+--------------+--------------+--------------+--------------+
| 2010年 | 100 | 200 | 300 | 400 |
| 2011年 | 150 | 300 | 450 | 600 |
+---------+--------------+--------------+--------------+--------------+
2 rows in set (0.00 sec)
4. 通过IF聚合函数实现
mysql> SELECT year,
-> SUM(IF(season = '一季度', orderCount, null)) AS '第一季度',
-> SUM(IF(season = '二季度', orderCount, null)) AS '第二季度',
-> SUM(IF(season = '三季度', orderCount, null)) AS '第三季度',
-> SUM(IF(season = '四季度', orderCount, null)) AS '第四季度'
-> FROM t_temp
-> GROUP BY year;
+---------+--------------+--------------+--------------+--------------+
| year | 第一季度 | 第二季度 | 第三季度 | 第四季度 |
+---------+--------------+--------------+--------------+--------------+
| 2010年 | 100 | 200 | 300 | 400 |
| 2011年 | 150 | 300 | 450 | 600 |
+---------+--------------+--------------+--------------+--------------+
2 rows in set (0.00 sec)
5. 总结
以需求驱动技术,技术本身没有优略之分,只有业务之分。
本文原作者asd1123509133,原文链接http://blog.51cto.com/lisea/1949764 标签: MySQL DBA pivot 声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:4051308@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。