利用Oracle实现两次分组的技巧(oracle 两次分组)
利用Oracle实现两次分组的技巧
在实际应用中,需要根据多个字段对数据进行分组,从而更好地了解数据的特征及其分布情况。Oracle提供了强大的分组查询语法GROUP BY,可以轻松实现单字段分组,但是实现多个字段分组需要一些技巧。本文将介绍如何使用Oracle实现两次分组。
一、单字段分组
首先我们来介绍一下Oracle的单字段分组语法:
SELECT field1, COUNT(*) FROM table1 GROUP BY field1;
上面的语法可以根据表table1中的字段field1进行分组,统计每组中记录的数量。
二、多字段分组
接下来我们将使用一个示例表来演示如何进行多字段分组。假设我们有一个学生信息表,表中包含以下字段:学号、姓名、性别、年龄、班级、成绩等。现在我们要统计每个班级中男女生各有多少人,并且按照性别从高到低排序。
我们可以使用以下语句进行多字段分组:
SELECT class, sex, COUNT(*) FROM student GROUP BY class, sex;
上面的语句可以实现根据班级和性别进行分组,统计每组中记录的数量。
三、两次分组
以上的多字段分组语句只能统计每个班级中男女生的数量,并且无法按照性别进行排序。因此,我们需要使用两次分组来完成这个任务。
我们先使用以下语句进行第一次分组,按照班级和性别统计每组中记录的数量:
SELECT class, sex, COUNT(*) FROM student GROUP BY class, sex;
然后在上面的查询结果中进行第二次分组,按照性别统计每组中记录的数量,最终得到每个班级中男女生各有多少人,并且按照性别从高到低排序的结果:
SELECT class, SUM(CASE WHEN sex='男' THEN cnt ELSE 0 END) AS male_cnt,
SUM(CASE WHEN sex='女' THEN cnt ELSE 0 END) AS female_cntFROM (
SELECT class, sex, COUNT(*) AS cnt FROM student GROUP BY class, sex) t
GROUP BY classORDER BY male_cnt DESC, female_cnt DESC;
上面的语句中,我们首先使用子查询进行第一次分组,然后在查询结果中使用SUM函数和CASE表达式进行第二次分组。
代码实现:
CREATE TABLE student(
id NUMBER PRIMARY KEY, name VARCHAR2(20),
sex VARCHAR2(2), age NUMBER,
class VARCHAR2(10), score NUMBER
);
INSERT INTO student(id, name, sex, age, class, score) VALUES(1, '张三', '男', 19, '1班', 90);
INSERT INTO student(id, name, sex, age, class, score) VALUES(2, '李四', '男', 20, '1班', 80);
INSERT INTO student(id, name, sex, age, class, score) VALUES(3, '王五', '女', 19, '1班', 85);
INSERT INTO student(id, name, sex, age, class, score) VALUES(4, '赵六', '女', 20, '1班', 95);
INSERT INTO student(id, name, sex, age, class, score) VALUES(5, '钱七', '男', 18, '2班', 70);
INSERT INTO student(id, name, sex, age, class, score) VALUES(6, '孙八', '男', 19, '2班', 60);
INSERT INTO student(id, name, sex, age, class, score) VALUES(7, '周九', '女', 18, '2班', 75);
INSERT INTO student(id, name, sex, age, class, score) VALUES(8, '吴十', '女', 19, '2班', 80);
SELECT class, SUM(CASE WHEN sex='男' THEN cnt ELSE 0 END) AS male_cnt, SUM(CASE WHEN sex='女' THEN cnt ELSE 0 END) AS female_cnt
FROM ( SELECT class, sex, COUNT(*) AS cnt FROM student GROUP BY class, sex
) tGROUP BY class
ORDER BY male_cnt DESC, female_cnt DESC;
输出结果如下:
CLASS MALE_CNT FEMALE_CNT
1班 2 22班 2 2
总结
本文介绍了如何利用Oracle实现两次分组,包括单字段分组、多字段分组和两次分组。通过多次分组,我们可以更加深入地了解数据的特性和分布情况,从而更好地进行数据挖掘和分析。