collect_set 与 collect_list 的区别就是set去重,list不去重
4)case when
case when <expr> then <result>…else <default> end
if(expr, true_result, false_result)
复制代码
case when 语句是SQL中的一个非常紧张的功能,可以完成很多复杂的盘算,相称于一个表达式,可以放在任何可放表达式的地方。
2、案例
例子1
转换为
select
t1.base,
concat_ws('|', collect_set(t1.name)) as name
from
(select name,concat(constellation, ",", blood_type) as base
from person_info) as t1
group by
t1.base;
复制代码
例子2
转换为
select
stu_name,
concat_ws(',',collect_set(course)) as course,
concat_ws(',',collect_set(score)) as score
from student
group by stu_name
复制代码
例子3
转换为
Select
name,
sum(case when item=数学 then score end) as math,
sum(case when item=英语 then score end) as english,
From table
Group by name
复制代码
剖析:首先写出select name from table group by name, 由于select后有几个字段,最终输出就是几个字段,所以我们需要把目标数据的”math”和“english”两个字段想办法得出来。
之后可以对item字段所有摆列的结果进行case when判断,将score填值进入,由于末了我们需要对name做一下聚合,需要明确的是一样寻常选取字段一定要出如今groupby内里。
聚合函数可以不消,所以我们在外面套一层sum做聚合,这样得到sum的结果和单人得分结果是同等的,由于我们以name做了一遍聚合,而每个用户对一门课程只有一个成绩,所以这样就可以得到最终结果。