开发者社区> 技术小胖子> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

MySQL DML操作--------实现pivot行转列功能最佳实战

简介:
+关注继续查看

1. 背景

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

wKiom1lxsSSxDTNgAAEQZy1NYpE561.jpg

2. 表与数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> select from t_temp;
+---------+-----------+------------+
year    | season    | orderCount |
+---------+-----------+------------+
| 2010年  | 一季度    |        100 |
| 2010年  | 二季度    |        200 |
| 2010年  | 三季度    |        300 |
| 2010年  | 四季度    |        400 |
| 2011年  | 一季度    |        150 |
| 2011年  | 二季度    |        300 |
| 2011年  | 三季度    |        450 |
| 2011年  | 四季度    |        600 |
+---------+-----------+------------+
rows in set (0.00 sec)


3. 通过子查询与case when判断实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
mysql> select yearsum(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 |
+---------+--------------+--------------+--------------+--------------+
rows in set (0.00 sec)


4. 通过IF聚合函数实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 |
+---------+--------------+--------------+--------------+--------------+
rows in set (0.00 sec)


5. 总结

以需求驱动技术,技术本身没有优略之分,只有业务之分。




      本文转自asd1123509133 51CTO博客,原文链接:http://blog.51cto.com/lisea/1949764,如需转载请自行联系原作者





版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Qt-QML-Button-ButtonStyle-实现鼠标滑过点击效果
上次实现的自定义的Button功能是用的自定义的Rectangle来实现的,在慢慢的接触了QML之后,发现QML有自己定义的Button
83 0
isual Studio 2013编译ImageMagick---转
  “该文引用自 CruiseYoung的:Visual Studio 2013编译ImageMagick   http://blog.csdn.net/fksec/article/details/36008343”     1 前期准备 1.
1369 0
Bitmap和ImageView显示下载的图片(I/O的理解)
本篇博文Deprecated 最新文章请参见 I/0流的梳理和小结 1 利用图片的路径,得到图片的字节数组 public static byte [] getImage(String path) throws Exception{ ...
837 0
mysqli的预处理功能使用
1 2 3 4 查询剩余羽绒服信息 5 6 7 8 9 10 11 12 13 输入要查询的品牌14 15 16 输入要查询的货号17 18...
695 0
21114
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载