SQL语句优化-关于分组求平均值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL语句优化-关于分组求平均值相关的知识,希望对你有一定的参考价值。

SELECT A.帐户号,SUM(钱)/(SELECT COUNT(*) FROM (SELECT 月 FROM 账单 A WHERE A.帐户号=1111 AND GROUP BY 月)) AS 月平均消费 FROM 账单 A WHERE A.帐户号=1111 GROUP BY A.帐户号

以上求的是无数年里平均每月花多少钱
谁能优化一下,不这么复杂?
是ORACLE的。忘了说。

试试我写的这个呢:

select 帐户号,avg(月消费) as 月均消费
from (select 帐户号,月,sum(钱) as 月消费
from 账单 group by 帐户号,月) as 月汇总表
where 帐户号=1111
group by 帐户号

思路就是:先查出一个月汇总表,再从此数据集中用Avg()函数,当然不用Avg()函数的话换成 “sum(月消费)/count(月) as 月均消费” 也行。

要注意:AVG、COUNT、MAX 和 MIN 忽略空值,而 COUNT(*) 不忽略。

GoodLuck!
参考技术A select A.帐户号, datepart(m, 消费日期), sum(钱) from 账单 A group by A.帐户号, datepart(m, 消费日期)

如果要以月份显示在前面,只需要将group by中的两个条件颠倒一下即可
参考技术B --> 生成测试数据表:这种就是计算有消费日期的月的月平均消费一种算法
IF OBJECT_ID('[账单]') IS NOT NULL
DROP TABLE [账单]
CREATE TABLE 账单
( 帐户号 char(10),消费日期 DATETIME,
钱 FLOAT,
)
INSERT INTO 账单
SELECT '1111','2009-01-03',1254 UNION ALL
SELECT '1111','2010-03-02',2345 UNION ALL
SELECT '1111','2010-05-25',20

SELECT A.帐户号,SUM(钱)/( COUNT(DISTINCT datepart(m, 消费日期))) AS 月平均消费 FROM 账单 A WHERE A.帐户号=1111 GROUP BY A.帐户号
--> 生成测试数据表:这种就是计算从最早消费月到最近消费月的月平均消费一种算法
IF OBJECT_ID('[账单]') IS NOT NULL
DROP TABLE [账单]
CREATE TABLE 账单
( 帐户号 char(10),消费日期 DATETIME,
钱 FLOAT,
)
INSERT INTO 账单
SELECT '1111','2009-01-03',1254 UNION ALL
SELECT '1111','2010-03-02',2345 UNION ALL
SELECT '1111','2010-05-25',20
SELECT A.帐户号,SUM(钱)/(datediff(mm,min(消费日期),max(消费日期))) AS 月平均消费 FROM 账单 A WHERE A.帐户号=1111 GROUP BY A.帐户号

14.SQL语句[6] 聚合分组

--======================聚合函数============================
--求和sum    求平均avg   求个数count   最大值max    最小值min
select
    sum(金额) as 总金额,
    avg(金额) as 平均金额,
    max(金额) as 最大金额,
    min(金额) as 最小金额,
    COUNT(*) as 订单数
from 数据

--为什么运行时报错?
select 商品,SUM(金额) as 总金额 from 数据

--聚合之后的1个结果,无法与多行数据对应,所以报错
--结论1:select使用了聚合函数之后,后面不能直接跟其他字段
select SUM(金额) as 总金额 from 数据
select 商品 from 数据

--======================分组统计============================
--统计一下,每个商品的总销售额,按商品类分组统计
--使用了SUM(金额)之后,它就不是表示所有商品的金额总和,而是表示每一个组
--内部的总和
--结论2:select后面如果有聚合,那么如果要跟其他字段,那么“其他字段”
--要么分组、要么聚合。
select 
    商品,
    SUM(金额) as 总金额,
    AVG(金额) as 平均金额, 
    MAX(金额) as 最大金额, 
    MIN(金额) as 最小金额
from 数据 group by 商品-----分组统计中   先执行分组   再执行聚合


--======================分组筛选============================
--统计一下每个部门金额达到100的订单的销售总额
select 销售部门,SUM(金额) as 总销售额 from 数据 group by 销售部门
select 销售部门,SUM(金额) as 总销售额 from 数据 where 金额>=100 group by 销售部门
--where 金额>=100  这个筛选是分组之前对数据源的筛选。


--统计一下销售总额超过8000的部门信息
select 销售部门,SUM(金额) as 总销售额 from 数据
    group by 销售部门 having SUM(金额)>=8000
--having SUM(金额)>=8000  这个筛选是在分组之后的基础上做的筛选

 

以上是关于SQL语句优化-关于分组求平均值的主要内容,如果未能解决你的问题,请参考以下文章

sql求平均值

怎样编写SQL语句求平均成绩

java位运算求平均值,实战案例

14.SQL语句[6] 聚合分组

怎样编写SQL语句求平均成绩

简单的oracle sql语句练习