Hive练习题之行转列(二)

需求:

+-------------+---------------+-----------------+----------------+---------------------+------------------+
| student.id  | student.name  | student.gender  | student.birth  | student.department  | student.address  |
+-------------+---------------+-----------------+----------------+---------------------+------------------+
| 201901      | 张大佬           || 1985           | 计算机系                | 北京市海淀区           |
| 201902      | 郭大侠           || 1986           | 中文系                 | 北京市昌平区           |
| 201903      | 张三            || 1990           | 中文系                 | 湖南省永州市           |
| 201904      | 李四            || 1990           | 英语系                 | 辽宁市阜新市           |
| 201905      | 王五            || 1991           | 英语系                 | 福建省厦门市           |
| 201906      | 王六            || 1988           | 计算机系                | 湖南省衡阳市           |
+-------------+---------------+-----------------+----------------+---------------------+------------------+

请写一条sql将以上数据, 转换成下面的结果

+-------+----+----+-----+
|  院系    ||| 总计  |
+-------+----+----+-----+
| 中文系    | 1  | 1  | 2   |
| 英语系    | 1  | 1  | 2   |
| 计算机系  | 2  | 0  | 2   |
+-------+----+----+-----+

– 建表

create table if not exists test.tb_student (
      id string,
      name string,
      gender string,
      birth string,
      department string,
      address string
)
row format delimited fields terminated by ",";

–导入数据

vi /doit/student
201901,张大佬,,1985,计算机系,北京市海淀区
201902,郭大侠,,1986,中文系,北京市昌平区
201903,张三,,1990,中文系,湖南省永州市
201904,李四,,1990,英语系,辽宁市阜新市
201905,王五,,1991,英语系,福建省厦门市
201906,王六,,1988,计算机系,湖南省衡阳市

load data local inpath "/doit/student" into table test.tb_student;

– 方法1

select 
      `院系`,
      sum(``) ``,
      sum(``) ``,
      sum(``) + sum(``) as `总计`
from
(
    select department `院系`,
    case gender when "男" then 1 else 0 end ``,
    case gender when "女" then 1 else 0 end ``
    from tb_student
) a
group by `院系`;

– 方法1加强

select
     department  `院系`,
     sum(case gender when "男" then 1 else 0 end) ``, 
     sum(case gender when "女" then 1 else 0 end) ``,
     sum(case  when gender = "女" or  gender = "男" then 1 else 0 end) `总计`
from
    tb_student
group by department

– 方法2

with tmp as (
select
     department,
     gender,
     count (1) cnt
from tb_student
group by department,gender)

select
     department `院系`,
     nvl(gc['男'],0) ``,
     nvl(gc['女'],0) ``,
	 -- floor是向下取整
     floor(nvl(gc['男'],0) + nvl(gc['女'],0)) `总计`
from
(
        select
             department,
             str_to_map(concat_ws(",",collect_list(concat_ws(":",gender,cast (cnt as string)))),",",":") gc
        from
       		    tmp
        group by 
		        department
) t 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值