我试图弄清楚这段代码的用途:
SELECT EMP_ID, SUM(INV_PRICE) AS TOTAL_SALES
FROM INVOICE
GROUP BY EMP_ID
HAVING SUM(INV_PRICE) <= AVG(INV_PRICE);
我写了它或建议在一段时间之前,现在我不确定它是否做了我原本希望它做的事情。
我想要的是:我有一张价格和员工的发票表。我想让每个员工的总销售额与所有员工的平均总销售额进行比较。从那里我希望结果能够告诉我哪些员工的销售低于平均水平。
我上面的内容是否正确?
这是我在运行&lt; = average:
时得到的结果
以下是我运行时获得的&gt;平均:
我认为我的主要关注点是确保它正在计算正确的平均值。这是每位员工的平均金额。
答案 0 :(得分:3)
我上面的内容是否正确?
没有。您的查询可能没有返回任何记录(只有一次销售)。 sum(inv_price)大多数时间大于或等于任何给定组的avg(inv_price)。
您想要预先计算另一个查询中的平均值。
答案 1 :(得分:2)
你想要的是这个:
SELECT EMP_ID, SUM(INV_PRICE) AS TOTAL_SALES
FROM INVOICE
GROUP BY EMP_ID
HAVING SUM(INV_PRICE) <= (
SELECT AVG(INV_SUM)
FROM (
SELECT SUM(INV_PRICE) AS INV_SUM
FROM INVOICE
GROUP BY EMP_ID) x) ;
此处计算的平均值超过所有员工,而您在每个组中进行计算,这是非感性的:总和不能超过任何给定组的平均值。< / p>
答案 2 :(得分:1)
不,不是。 SUM(INV_PRICE)
将为您提供员工的总销售额,但AVG(INV_PRICE)
将为您提供每位员工的平均销售额,而不是其总销售额的平均值(针对所有员工)。
试试这个你想要为所有员工计算的总销售额的平均值 - 即使那些根本没有销售的人:
SELECT EMP_ID, SUM(INV_PRICE) AS TOTAL_SALES
FROM INVOICE
GROUP BY EMP_ID
HAVING SUM(INV_PRICE) <=
( SELECT SUM(INV_PRICE) FROM INVOICE )
/ ( SELECT COUNT(*) FROM EMPLOYEE )
;
或者如果你想要有销售的所有员工的平均值:
SELECT EMP_ID, SUM(INV_PRICE) AS TOTAL_SALES
FROM INVOICE
GROUP BY EMP_ID
HAVING SUM(INV_PRICE) <=
( SELECT SUM(INV_PRICE) / COUNT(DISTINCT EMP_ID)
FROM INVOICE )
;
略过一下,Access没有COUNT(DISTINCT )
:
SELECT EMP_ID, SUM(INV_PRICE) AS TOTAL_SALES
FROM INVOICE
GROUP BY EMP_ID
HAVING SUM(INV_PRICE) <=
( SELECT AVG(TOTAL_SALES)
FROM
( SELECT SUM(INV_PRICE) AS TOTAL_SALES
FROM INVOICE
GROUP BY EMP_ID
) tmp
) ;