1. 背景
* 由于MySQL 不支持类型Oracle与SQL Server的pivot功能进行行列转换。
<a href="https://s3.51cto.com/wyfs02/M00/9C/88/wKiom1lxsSSxDTNgAAEQZy1NYpE561.jpg" target="_blank"></a>
2. 表与数据
<code>mysql> </code><code>select</code> <code>* </code><code>from</code> <code>t_temp;</code>
<code>+</code><code>---------+-----------+------------+</code>
<code>| </code><code>year</code> <code>| season | orderCount |</code>
<code>| 2010年 | 一季度 | 100 |</code>
<code>| 2010年 | 二季度 | 200 |</code>
<code>| 2010年 | 三季度 | 300 |</code>
<code>| 2010年 | 四季度 | 400 |</code>
<code>| 2011年 | 一季度 | 150 |</code>
<code>| 2011年 | 二季度 | 300 |</code>
<code>| 2011年 | 三季度 | 450 |</code>
<code>| 2011年 | 四季度 | 600 |</code>
<code>8 </code><code>rows</code> <code>in</code> <code>set</code> <code>(0.00 sec)</code>
3. 通过子查询与case when判断实现
<code>mysql> </code><code>select</code> <code>year</code><code>, </code><code>sum</code><code>(orderCount1) </code><code>'第一季度'</code><code>, </code>
<code> </code><code>-> </code><code>sum</code><code>(orderCount2) </code><code>'第二季度'</code><code>, </code>
<code> </code><code>-> </code><code>sum</code><code>(orderCount3) </code><code>'第三季度'</code><code>, </code>
<code> </code><code>-> </code><code>sum</code><code>(orderCount4) </code><code>'第四季度'</code>
<code> </code><code>-> </code><code>from</code>
<code> </code><code>-> (</code>
<code> </code><code>-> </code><code>select</code> <code>year</code><code>, </code>
<code> </code><code>-> </code><code>case</code> <code>when</code> <code>season = </code><code>'一季度'</code> <code>then</code>
<code> </code><code>-> orderCount </code>
<code> </code><code>-> </code><code>end</code> <code>orderCount1, </code>
<code> </code><code>-> </code><code>case</code> <code>when</code> <code>season = </code><code>'二季度'</code> <code>then</code>
<code> </code><code>-> </code><code>end</code> <code>orderCount2, </code>
<code> </code><code>-> </code><code>case</code> <code>when</code> <code>season = </code><code>'三季度'</code> <code>then</code>
<code> </code><code>-> </code><code>end</code> <code>orderCount3, </code>
<code> </code><code>-> </code><code>case</code> <code>when</code> <code>season = </code><code>'四季度'</code> <code>then</code>
<code> </code><code>-> </code><code>end</code> <code>orderCount4 </code>
<code> </code><code>-> </code><code>from</code> <code>t_temp</code>
<code> </code><code>-> ) t </code>
<code> </code><code>-> </code><code>group</code> <code>by</code> <code>year</code><code>;</code>
<code>+</code><code>---------+--------------+--------------+--------------+--------------+</code>
<code>| </code><code>year</code> <code>| 第一季度 | 第二季度 | 第三季度 | 第四季度 |</code>
<code>| 2010年 | 100 | 200 | 300 | 400 |</code>
<code>| 2011年 | 150 | 300 | 450 | 600 |</code>
<code>2 </code><code>rows</code> <code>in</code> <code>set</code> <code>(0.00 sec)</code>
4. 通过IF聚合函数实现
<code>mysql> </code><code>SELECT</code> <code>year</code><code>, </code>
<code> </code><code>-> </code><code>SUM</code><code>(IF(season = </code><code>'一季度'</code><code>, orderCount, </code><code>null</code><code>)) </code><code>AS</code> <code>'第一季度'</code><code>,</code>
<code> </code><code>-> </code><code>SUM</code><code>(IF(season = </code><code>'二季度'</code><code>, orderCount, </code><code>null</code><code>)) </code><code>AS</code> <code>'第二季度'</code><code>,</code>
<code> </code><code>-> </code><code>SUM</code><code>(IF(season = </code><code>'三季度'</code><code>, orderCount, </code><code>null</code><code>)) </code><code>AS</code> <code>'第三季度'</code><code>,</code>
<code> </code><code>-> </code><code>SUM</code><code>(IF(season = </code><code>'四季度'</code><code>, orderCount, </code><code>null</code><code>)) </code><code>AS</code> <code>'第四季度'</code>
<code> </code><code>-> </code><code>FROM</code> <code>t_temp</code>
<code> </code><code>-> </code><code>GROUP</code> <code>BY</code> <code>year</code><code>;</code>
5. 总结
以需求驱动技术,技术本身没有优略之分,只有业务之分。
本文转自asd1123509133 51CTO博客,原文链接:http://blog.51cto.com/lisea/1949764,如需转载请自行联系原作者