SQLite3数据分组与计算

本文讨论SQLite3数据库中的分组查询、使用聚合函数计算列数据、计算行数据,以及case表达式的应用。

聚合函数

首先介绍SQLite3数据库中的聚合函数,这些函数可以对字段数据进行统计。示例中还会使用前一篇文章中创建的t3表和数据。

count()函数的功能为计数,可以统计全部或指定条件的记录有多少,如下面的代码会统计t3表中f2字大于等于80的记录数量。

SQLite3
select count(*) as f2_count from t3 where f2>=80;

代码中,使用count(*)统计记录行数,并使用as关键指定统计字段名为f2_count,查询条件指定f2指定大于等于80,查询结果如下图所示。

查询结果

本例,count()函数中也可以直接使用字段名,如count(f2)。

sum()和total()函数都可以计算数据的合计,并忽略null值,两个函数的区别在于,如果数据都是null值,sum()函数返回null,而total()函数会返回0.0。下面的代码演示了这两个函数的应用。

SQLite3
select sum(f2) as f2_sum, sum(f3) as f3_total from t3;

代码会计算f2和f3字段所有记录的合计,执行结果如下图所示。

查询结果

min()和max()函数分别计算数据的最小值和最大值,如下面的代码可以计算t3表中f2字段中的最小值和最大值。

SQLite3
select min(f2) as f2_min, max(f2) as f2_max from t3;

查询结果如下图所示。

查询结果

min()和max()函数除了作为聚合函数计算列数据,还可以获取两个或多个参数中的最小值和最大值,如下面的代码。

SQLite3
select min(1,2,3),max(1,2,3);

查询结果如下图所示。

查询结果

avg()函数可以计算数据的平均数,如果数据都为null则返回null值。如下面的代码会计算t3表中f2字段数据的平均数。

SQLite3
select avg(f2) as f2_avg from t3;

计算结果如下图所示。

查询结果

group_concat()函数可以将一列数据连接为文本,其中,参数一指定字段名,参数二指定分隔符,如果不指定分隔符,默认使用英文逗号(,)分隔,如下面的代码可以将t3表中f2字段的数据连接为以逗号分隔的文本。

SQLite3
select group_concat(f2) as f2_values from t3;

查询结果如下图所示。

查询结果

行数据计算

聚合函数用于计算列数据,如果需要计算每一行的数据,则需要使用运算符书写运算表达式,并可以使用as关键字指定计算列的名称,如下面的代码会计算t3表每条记录中f2、f3、f4字段的合计数和平均数。

SQLite3
select f1,f2,f3,f4,
(f2+f3+f4) as row_sum,
round((f2+f3+f4)/3.0,1) as row_avg
from t3;

查询结果如下图所示。

查询结果

本例,在row_avg计算列中还使用了round()函数格式化浮点数,通过第二个参数指定显示1位小数。

case表达式

case表达式有两种语法,第一种是在case关键字后指定表达式,每一个when...then处理一个值和对应的返回结果,如果没有匹配的值,可以使用else关键字指定默认的返回值,如下面的代码。

SQLite3
select case 1
when 1 then '一季度'
when 2 then '二季度'
when 3 then '三季度'
when 4 then '四季度'
else null
end
as quarter_name;

代码中,从case到end关键字是case表达式部分,其中,在case关键字后指定了需要判断的值,然后,在when部分会根据数据返回季度名称,如果数值不是1到4则返回null值。最后会将查询结果的列名定义为quarter_name,查询结果如下图所示。

查询结果

case表达式的另一种应用格式是不指定case关键字后的表达式,而是在when关键字后指条件,并按条件返回对应的值。如下面的代码,会根据f2字段的数据显示等级。

SQLite3
select f1,f2,
case when f2>=80 then 'A'
when f2>=70 and f2<80 then 'B'
when f2>=60 and f2<70 then 'C'
when f2<60 then 'D'
else null
end as f2_level
from t3;

代码的功能是根据t3表中f2字段数据确定其等级(f2_level),其中,大于等于80为'A'级,小于80且大于等于70为'B'级,小于70且大于等于60为'C'级,小于60为'D'级。查询结果如下图所示。

查询结果

分组与计算

接下来,在演示分组与计算时使用如下代码创建的t4表和数据。

SQLite3
create table t4(f1 integer,f2 text,f3 integer);

insert into t4(f1,f2,f3) values(1,'C',60),
(2,'B',70),
(1,'D',50),
(2,'A',80),
(2,'A',90),
(1,'A',80),
(1,'A',90),
(2,'C',60),
(1,'B',70),
(1,'A',90);

对数据进行分组查询时需要在select语句中使用group by子句,如下面的代码可以统计t4表中f1字段等于1或2的记录分别有多少。

SQLite3
select f1,count(f1) as f1_count from t4 group by f1;

查询结果如下图所示。

查询结果

再来看一个示例,如下面的代码可以计算f1为1或2的记录数量和对应的f3字段的平均数。

SQLite3
select f1,count(f1) as f1_count, avg(f3) as f3_avg from t4
group by f1;

查询结果如下图所示。

查询结果

工作中,还可以进行多级分组,如下面的代码会统计f1字段为1或2时,f2字段各种数值的记录分别有多少。

SQLite3
select f1,f2,count(*) as row_count from t4 group by f1,f2;

查询结果如下图所示。

查询结果

指定分组查询返回结果的条件时需要使用having关键字,如下面的代码可以只返回row_count大于等于2的记录。

SQLite3
select f1,f2,count(*) as row_count from t4 
group by f1,f2 having row_count>=2;

查询结果如下图所示。

查询结果

对于查询和汇总计算的结果,可以全选并复制,然后粘贴到Excel或WPS表格等电子表格软件中进一步处理。