案例
一、
创建一个新的文件:emp_sex.txt
vim emp_sex.txt
数据准备
悟空,A,男
大海,A,男
宋宋,B,男
凤姐,A,女
婷姐,B,女
婷婷,B,女
创建新的表用于存储数据
create table emp_sex(
name string,
dept_id string,
sex string)
row format delimited fields terminated by ",";
导入数据
load data local inpath'/opt/module/data/emp_sex.txt' into table emp_sex;
需求:
求出不同部门男女各多少。
code:
select
dept_id,
sum(case sex when '男' then 1 else 0 end) maleCount,
sum(case sex when '女' then 1 else 0 end) femaleCount
from
emp_sex
group by dept_id;
结果:
二、创建一个新的文件
vim person_info.txt
数据准备
孙悟空,白羊座,A
大海,射手座,A
宋宋,白羊座,B
猪八戒,白羊座,A
凤姐,射手座,A
苍老师,白羊座,B
创建新的表用于存储数据
create table person_info(
name string,
constellation string,
blood_type string)
row format delimited fields terminated by ",";
导入数据
load data local inpath'/opt/module/data/person_info.txt' into table person_info;
需求
把星座和血型一样的人归类到一起。
分步解决。
1、先将星座和血型拼接在一起。
select
concat(constellation,',',blood_type) con_blood,
name
from
person_info;
结果:
2、 在1的基础上将con_blood的人的名字合并在一行。
select
con_blood,
collect_set(name) name_arr
from
(select
concat(constellation,',',blood_type) con_blood,
name
from
person_info)t1
group by con_blood;
结果:
3、利用concat_ws对列表中的字符串进行拼接
select
con_blood,
concat_ws('|',name_arr)
from
(select
con_blood,
collect_set(name) name_arr
from
(select
concat(constellation,',',blood_type) con_blood,
name
from
person_info)t1
group by con_blood)t2;
or
select
con_blood,
concat_ws('|',collect_set(name))
from
(select
concat(constellation,',',blood_type) con_blood,
name
from
person_info)t1
group by con_blood;
结果: