「SQL每日一练」:行列转换

本文探讨了如何通过SQL操作将数据表dep_score中的多行数据转化为多列,包括问题一的行转列和问题二的列转行,以及如何处理同一部门多绩效情况。实例演示了如何使用聚合函数和CASE WHEN语句进行数据重塑。
摘要由CSDN通过智能技术生成


数据表介绍

提示:这里只是提供一个练习的数据表,没有任何实际含义。

表名:dep_score

字段:

  • a:年份
  • b:部门
  • c:绩效得分

表数据:

abc
2014B9
2015A8
2014A10
2015B7

问题一:多行转多列

问题描述:

将上述表内容转为如下输出结果所示。

acol_Acol_B
2014109
201587

SQL脚本:

select a,
max(case when b='A' then c end) as col_A,
max(case when b='B' then c end) as col_B
from dep_score 
group by a 
;

问题二:多列转多行

问题描述:

也就是将问题一得到的结果如何转化回原始的表,这里将问题一得到的结果表记为dep_score_new

SQL脚本:

select a,b,c 
from (
    select a, 'A' as b, col_a as c 
    from dep_score_new 
    union all 
    select a, 'B' as b, col_b as c 
    from dep_score_new 
)t 
;

问题三:当同一部门存在多个绩效,如何对其进行行转列操作

问题描述:

其实其存在多个值的时候,更符合我们实际遇到的情景。

现在我们使用的数据表 dep_score 内容如下:

abc
2014B9
2015A8
2014A10
2015B7
2014B6

SQL脚本:

select a, 
max(case when b='A' then c end) as col_A,
max(case when b='B' then c end) as col_B 
from (
    select a,b,
    concat_ws(",", collect_set(cast(c as string))) as c 
    from dep_score 
    group by a,b 
)tmp
group by a 
;

这样我们就能够得到下面的结果:

acol_Acol_B
2014106,9
201587


一天学习一点点~



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

统计小白er

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值