我的查询就是这样...
SELECT
ClientId,
AVG(Rate)
FROM
Clients
GROUP BY
ClientId
WITH ROLLUP
这给...
NULL, 17.5769
1, 16.75
2, 17.50
3, 18.50
4, 17.50
5, 18.50
这是错误的平均值。应该是17.75。
此查询出了什么问题?
答案 0 :(得分:5)
您误会了平均值的计算方式。如果您要计算组平均值的avg
,则会看到您期望的17.75
:
select ClientID
,avg(Rate) as AvgRate
from (values(1, 16.75)
,(2, 17.50)
,(3, 18.50)
,(4, 17.50)
,(5, 18.50)
) as r(ClientID, Rate)
group by ClientID
with rollup;
+----------+-----------+
| ClientID | AvgRate |
+----------+-----------+
| 1 | 16.750000 |
| 2 | 17.500000 |
| 3 | 18.500000 |
| 4 | 17.500000 |
| 5 | 18.500000 |
| NULL | 17.750000 |
+----------+-----------+
因为您使用的是with rollup
,所以它(正确地)计算了整个数据集的平均值作为您的总值 的平均值,该平均值与计算小组平均值的平均值。
答案 1 :(得分:3)
平均值的平均值与所有值的平均值不同。请执行以下操作:
SELECT a,
AVG(b) AS AvB
FROM (VALUES (1, 5.0),
(1, 7.0),
(2, 9.0),
(3, 4.0),
(3, 5.0),
(4, 6.0)) V (a, b)
GROUP BY a;
SELECT AVG(b) AS AvAll
FROM (VALUES (1, 5.0),
(1, 7.0),
(2, 9.0),
(3, 4.0),
(3, 5.0),
(4, 6.0)) V (a, b);
WITH CTE AS(
SELECT a,
AVG(b) AS AvB
FROM (VALUES (1, 5.0),
(1, 7.0),
(2, 9.0),
(3, 4.0),
(3, 5.0),
(4, 6.0)) V (a, b)
GROUP BY a)
SELECT AVG(AvB) AS AvgOfAvg
FROM CTE;
这给出了以下结果:
a AvB
----------- ---------------------------------------
1 6.000000
2 9.000000
3 4.500000
4 6.000000
AvAll
---------------------------------------
6.000000
AvgOfAvg
---------------------------------------
6.375000
请注意,最后2个结果不同。您位于第三个数据集中的值之后,但是,您正在执行的聚集是第二个。