求平均值,怎样计算

时间:2021-11-01 00:44:56
在数据表Manager中有三个字段:
ID(主键)、NF(年份)、XM(姓名)、Score(得分)、HZ_AVG(汇总平均分)

1     2000   zhangsan   80   NULL
2     2000   lisi       90   NULL 
3     2000   wangwu     70   NULL
4     2011   libai      89   NULL
5     2011   dufu       97   NULL

现在要对不同年份的得分求平均值,应该怎样计算???
然后还要将计算的结果写入第一个年份记录对应的字段中,应该怎样操作???

在这个例子中,比如:求“2000”年“得分”的“平均值”,然后将“平均值”写入年份是“2000”的记录中的第一条,它的HZ_AVG(汇总平均分字段中)。在这里就是写入第一条“zhangsan”对应的“HZ_AVG”中,第二、三条记录,也就是“lisi”、“wangwu”对应的“HZ_AVG”依然为空。

这样的功能应该怎样实现???用SQL语句能不能实现???

小弟的思路:
检索该表中的每一条记录,取记录中的“年份”。再根据年份,查询表返回结果集。对结果集进行判断看是不是记录数大于一,如果大于一那么对记录集中的“得分”求平均分,然后写入该记录的“汇总平均分”中。否则那么直接将“得分”写入“汇总平均分”。

小弟的方法可能效率有点低,各位大侠还有其它什么方法吗???

21 个解决方案

#1


我猜这个帖子你肯定不会结的,所以就算是我知道我也不告诉你

#2


avg

#3


引用 2 楼 wxr0323 的回复:
avg

+1

#4


avg + group by

#5


avg查询平均值

#6


SELECT AVG(X.LOAN_AMT) AVG_, TO_CHAR(X.LOAN_DATE, 'yyyy)LOAN_DATE_
  FROM FINANCE_LOAN X
 GROUP BY TO_CHAR(X.LOAN_DATE, 'yyyy')

用AVG和GROUP BY一起用就可以啦。

#7


引用 1 楼 cf_nxcxy 的回复:
我猜这个帖子你肯定不会结的,所以就算是我知道我也不告诉你


帖子肯定会结的,只是时间确实又点紧。

都是分批结的啊,不信可以问问大家。

#8


引用 6 楼 water527 的回复:
SELECT AVG(X.LOAN_AMT) AVG_, TO_CHAR(X.LOAN_DATE, 'yyyy)LOAN_DATE_
  FROM FINANCE_LOAN X
 GROUP BY TO_CHAR(X.LOAN_DATE, 'yyyy')

用AVG和GROUP BY一起用就可以啦。


能不能详细一点呢???

#9


;with cte1 as
(
    --假设你所说的第一条是指按ID升序排列   
    select MIN(ID) AS 'ID',AVG(Score) AS 'HZ_ZVG' from Manager where group by NF
), 
update Manager set HZ_AVG=cte1.HZ_ZVG where ID=cte1.ID

#10


多写了个where

#11


AVG 函数

#12


引用 9 楼 dongxinxi 的回复:
SQL code
;with cte1 as
(
    --假设你所说的第一条是指按ID升序排列   
    select MIN(ID) AS 'ID',AVG(Score) AS 'HZ_ZVG' from Manager where group by NF
), 
update Manager set HZ_AVG=cte1.HZ_ZVG where ID=cte1.ID


谢谢,自己先试试,帖子一会结。

#13


路过拿分,发现9楼方法非常巧妙,学习了

#14


引用 9 楼 dongxinxi 的回复:
SQL code
;with cte1 as
(
    --假设你所说的第一条是指按ID升序排列   
    select MIN(ID) AS 'ID',AVG(Score) AS 'HZ_ZVG' from Manager where group by NF
), 
update Manager set HZ_AVG=cte1.HZ_ZVG where ID=cte1.ID


这是什么写法呢???  “with”  ??? as  () , update Manager set 

#15


mark

#16


LZ,看看这个。

with cte1 as
(
   select BH as 'BH', min(sxh) as 'SXH',avg(PJF) as 'PJF' from KH_SubCompManager where nf='2011'  group by BH
),
update  KH_SubCompManager set DF=cte1.PJF where BH=cte1.BH and SXH=cte1.SXH

#17


引用 1 楼 cf_nxcxy 的回复:
我猜这个帖子你肯定不会结的,所以就算是我知道我也不告诉你


+1

#18


楼主,不知问题解决没?我可以帮你写个,如果需要的话留言啊!

#19


用存储过程或是游标都可以的,需要的话留言给我。

#20


avg查询平均值

#21


方案已经给你写好了,游标实现的,数据可名字改成你的就好了,最后记得顶一下,给加个分哦。
USE Sales_DB
DECLARE Del_Cursor CURSOR
FOR
SELECT MIN(ID)AS 'ID',AVG(Score) AS 'HZ_AVG' FROM T_test GROUP BY NF
OPEN Del_Cursor
DECLARE @id int,@hz int
FETCH NEXT FROM Del_Cursor INTO @id,@hz
WHILE(@@fetch_status=0)
BEGIN
BEGIN
UPDATE T_test SET HZ_AVG=@hz WHERE ID=@id
FETCH NEXT FROM Del_Cursor INTO @id,@hz
PRINT '成功!'
END
END
CLOSE Del_Cursor
DEALLOCATE Del_Cursor

#1


我猜这个帖子你肯定不会结的,所以就算是我知道我也不告诉你

#2


avg

#3


引用 2 楼 wxr0323 的回复:
avg

+1

#4


avg + group by

#5


avg查询平均值

#6


SELECT AVG(X.LOAN_AMT) AVG_, TO_CHAR(X.LOAN_DATE, 'yyyy)LOAN_DATE_
  FROM FINANCE_LOAN X
 GROUP BY TO_CHAR(X.LOAN_DATE, 'yyyy')

用AVG和GROUP BY一起用就可以啦。

#7


引用 1 楼 cf_nxcxy 的回复:
我猜这个帖子你肯定不会结的,所以就算是我知道我也不告诉你


帖子肯定会结的,只是时间确实又点紧。

都是分批结的啊,不信可以问问大家。

#8


引用 6 楼 water527 的回复:
SELECT AVG(X.LOAN_AMT) AVG_, TO_CHAR(X.LOAN_DATE, 'yyyy)LOAN_DATE_
  FROM FINANCE_LOAN X
 GROUP BY TO_CHAR(X.LOAN_DATE, 'yyyy')

用AVG和GROUP BY一起用就可以啦。


能不能详细一点呢???

#9


;with cte1 as
(
    --假设你所说的第一条是指按ID升序排列   
    select MIN(ID) AS 'ID',AVG(Score) AS 'HZ_ZVG' from Manager where group by NF
), 
update Manager set HZ_AVG=cte1.HZ_ZVG where ID=cte1.ID

#10


多写了个where

#11


AVG 函数

#12


引用 9 楼 dongxinxi 的回复:
SQL code
;with cte1 as
(
    --假设你所说的第一条是指按ID升序排列   
    select MIN(ID) AS 'ID',AVG(Score) AS 'HZ_ZVG' from Manager where group by NF
), 
update Manager set HZ_AVG=cte1.HZ_ZVG where ID=cte1.ID


谢谢,自己先试试,帖子一会结。

#13


路过拿分,发现9楼方法非常巧妙,学习了

#14


引用 9 楼 dongxinxi 的回复:
SQL code
;with cte1 as
(
    --假设你所说的第一条是指按ID升序排列   
    select MIN(ID) AS 'ID',AVG(Score) AS 'HZ_ZVG' from Manager where group by NF
), 
update Manager set HZ_AVG=cte1.HZ_ZVG where ID=cte1.ID


这是什么写法呢???  “with”  ??? as  () , update Manager set 

#15


mark

#16


LZ,看看这个。

with cte1 as
(
   select BH as 'BH', min(sxh) as 'SXH',avg(PJF) as 'PJF' from KH_SubCompManager where nf='2011'  group by BH
),
update  KH_SubCompManager set DF=cte1.PJF where BH=cte1.BH and SXH=cte1.SXH

#17


引用 1 楼 cf_nxcxy 的回复:
我猜这个帖子你肯定不会结的,所以就算是我知道我也不告诉你


+1

#18


楼主,不知问题解决没?我可以帮你写个,如果需要的话留言啊!

#19


用存储过程或是游标都可以的,需要的话留言给我。

#20


avg查询平均值

#21


方案已经给你写好了,游标实现的,数据可名字改成你的就好了,最后记得顶一下,给加个分哦。
USE Sales_DB
DECLARE Del_Cursor CURSOR
FOR
SELECT MIN(ID)AS 'ID',AVG(Score) AS 'HZ_AVG' FROM T_test GROUP BY NF
OPEN Del_Cursor
DECLARE @id int,@hz int
FETCH NEXT FROM Del_Cursor INTO @id,@hz
WHILE(@@fetch_status=0)
BEGIN
BEGIN
UPDATE T_test SET HZ_AVG=@hz WHERE ID=@id
FETCH NEXT FROM Del_Cursor INTO @id,@hz
PRINT '成功!'
END
END
CLOSE Del_Cursor
DEALLOCATE Del_Cursor