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语句优化-关于分组求平均值的主要内容,如果未能解决你的问题,请参考以下文章