我正在尝试修复使用AVG的问题,我发现了一些类似/相关的解决方案,并尝试将其应用于我的查询,但我仍然无法得到正确的解决方案。
这是我的疑问:
SELECT unt_id, sum(enteredCode) / count(DISTINCT unt_id) AS 'avg' FROM tbl_code GROUP BY unt_id
其中enteredCode的值为1,unt_id可以是Chemistry,Physics等。
我认为我错过了一些东西,因为它只显示总和而不是平均值。
答案 0 :(得分:1)
您应该只使用AVG功能:
Select unt_id, avg(enteredCode) from tbl_code group by unt_id
答案 1 :(得分:1)
尝试将GROUP BY视为占用一大堆行并将它们放入较小的堆中,其中每个较小的堆在所有组中都具有唯一值。
在您的查询中:
SELECT unt_id
, sum(enteredCode) / count(DISTINCT unt_id) AS 'avg'
FROM tbl_code
GROUP BY unt_id
你已经要求将所有行分组为unt_id,如果unt_id有6个不同的值,如1,3,9,12,18,24(表中有很多行),你将有6个第一组由unt_id = 1的所有行组成的组,第二组所有行的unt_id = 2,依此类推。
现在怎样? SUM(),COUNT(),AVG(),MAX(),MIN()等组函数将查看各组行,并为每组提供一个结果。
回到你的查询,要求为例如unt_id = 3的组的COUNT(DISTINCT unt_id),你只需得到1;数据库将所有行放在unt_id = 3的那一个组中,因此只有一个不同的unt_id值。第1组,第9组,第12组,第18组和第24组也是如此;他们的小组中只有一个不同的unt_id。 (另外,请注意使用此分组,每个组的MAX(unt_id)= MIN(unt_id)= unt_id。)
如果你只是考虑:
SELECT unt_id
, count(DISTINCT unt_id) as dist_count
FROM tbl_code
GROUP BY unt_id
您将为数据中的每个唯一unt_id值返回一行,并且每个dist_count将为1。在你自己的平均计算中使用这个计数(SUM(enteredCode)/ COUNT(DISTINCT unt_id))你基本上只是做SUM(enteredCode)/ 1所以你只看到了总和。
当你说“enteredCode的值为1”时,听起来像1是唯一的值,如果是这样的话,平均值就不会那么令人兴奋了 - 它也只是1。假设enteredCode有其他值,正如@bitfiddler所说,你可以使用AVG函数并调用它,假设你正在寻找每个unt_id组中所有行的平均enterCode。 (如果您想对平均值使用显式SUM / COUNT计算,请记住AVG()= SUM()/ COUNT()和其中为null的行将不予考虑。)
希望这可以提供一些见解,说明为什么你没有得到你想要的结果。