行转列:将多个列中的数据在一列中输出
列转行:将某列一行中的数据拆分成多行
concat(string1/col, string2/col, …)
输入任意个字符串(或字段,可以为int类型等),返回拼接后的结果
select concat(id,'-',name,'-',age)
from student;
concat_ws(separator, str1, str2, …)
特殊形式的 concat(),参数只能为字符串,第一个参数为后面参数的分隔符
分隔符可以是与后面参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间;
select concat_ws('-', name, gender)
from student;
collect_set(col)
将某字段进行去重处理,返回array类型;该函数只接受基本数据类型
select collect_set(age)
from student;
collect_set 与 collect_list 的区别就是set去重,list不去重
case when
if(expr, true_result, false_result)
case when 语句是SQL中的一个非常重要的功能,可以完成很多复杂的计算,相当于一个表达式,可以放在任何可放表达式的地方。
语法 case when 条件 then 结果 when 条件 then 结果 else end。else可不加,是缺省条件下的值,如果不加,有缺省情况则为NULL。CASE WHEN还可以和GROUP BY 语句搭配使用,用在sum,count,max等聚合函数内部。
结果
射手座,A 大海|凤姐
白羊座,A 孙悟空|猪八戒
白羊座,B 宋宋
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;
结果:
张三 语文,数学,英语 98,95,89
李四 语文,数学,英语 97,88,90
select
stu_name,
concat_ws(',',collect_set(course)) as course,
concat_ws(',',collect_set(score)) as score
from student
group by stu_name