一 行转列
行转列,列转行是我们在开发过程中经常碰到的问题。行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现。用传统的方法,比较好理解。层次清晰,而且比较习惯。
CREATE TABLE students_score(
cname VARCHAR(10),
course VARCHAR(10),
score INT(6)
);
INSERT INTO students_score VALUES
('张三','语文',74),
('张三','数学',83),
('张三','物理',93),
('李四','语文',65),
('李四','数学',87),
('李四','物理',90);
CREATE TABLE student(
stu_id INT(4) UNSIGNED PRIMARY KEY AUTO_INCREMENT,
stu_name VARCHAR(20)
);
INSERT INTO student(stu_name) VALUES
('张三'),('李四');
原表的输出结果如下:

经过行转列之后,也就是说分别合并张三和李四的四行变两行

SELECT cname 姓名,
MAX(CASE course WHEN '语文' THEN score ELSE 0 END ) 语文,
MAX(CASE course WHEN '数学' THEN score ELSE 0 END ) 数学,
MAX(CASE course WHEN '物理' THEN score ELSE 0 END ) 物理
FROM students_score
GROUP BY cname;

二 case when总结
- 当仅仅是case when然后需要group by 时,case when里面的字段就需要放在group by后
- 当sum(case when then else end) 时,因为其在sum,max等聚合字段里,case when里的字段就不需要放在group by后
三 collect_list/set
- concat_ws(“分隔符”,String或者Array[String])----第一个为分隔符,后面是将多个String类型拼接,或者一个String类型的数组(会将该数组类似于flatMap扁平化,将里面元素拿出来按照分隔符拼接)
- collect_set collect_list -----前面去重,后面不去重。行转列用法,将多行中的某一列聚合成一个集合放在一列中。
- 上面两个可以联合使用,select id,concat_ws(",",collect_list(字段)) from biao group by id; 标准行转列
- 因为collect_list/set是聚合操作,那么需要分组group by id聚合成一列。如果单纯是concat_ws就不需要分组。
SQL行转列技巧详解
本文深入探讨了SQL中行转列的实用技巧,重点介绍了如何利用CASEWHEN语句和PIVOT运算符实现数据转换,同时提供了具体示例,如学生分数表的行转列操作。此外,还讲解了CASEWHEN的使用要点和collect_list/set函数的应用场景。
640





