MySQL DML操作--------实现pivot行转列功能最佳实战
admin
2023-05-17 06:22:21
0

1. 背景

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

MySQL DML操作--------实现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. 总结

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

相关内容

热门资讯

惊人策划透出,“下一个是古巴”... 古巴局势正面临严重升级。据三位知情人士周五向美联社透露,美国司法部正准备对现年94岁的古巴前领导人劳...
人间烟火暖 家和岁月安——记2... 新华社北京5月15日电 题:人间烟火暖 家和岁月安——记2026年“最美家庭”新华社记者董博婷家是最...
公交侧翻致2名学生去世,知情人... 极目新闻记者 柳琛琛5月16日晚,左权县安委办通报,16日7时17分,左权县石暴村附近发生一起公交车...
瞭望·治国理政纪事|进一步夯实... ◇2025年5月,习近平总书记在河南考察时指出,河南作为经济大省,要进一步夯实实体经济这个根基,以科...
特朗普:不希望看到台湾有人闹“... 据凤凰卫视报道,美国总统特朗普5月15日结束访华行程后,在接受福克斯新闻采访时谈到台湾问题,他表示不...
美军下一代空空导弹AIM-26... 【文/观察者网 山猫】据专业航空新闻网站“航空学家”(The Aviationist)5月15日报道...
燃气热水器多少升代表什么意思 燃气热水器的升数指的就是其每分钟的热水流量,这个流量等于(△T25℃×X流量)÷Y设定温度。可以简单...
燃气热水器鸣笛 1、强排式热水器本身与自来水管、烟管会造成共振声。2、强排式热水器风机的前清扫工作时发出的响声。3、...
热水器排烟管可以排到烟道吗 不可以,管道内有大量的油烟及高温,油烟和粉尘相互造成影响,二者混在一起时间长了就不能正常工作,废气也...