[英]Group By and Having Clause description
我试图弄清楚这段代码是怎么回事:
SELECT EMP_ID, SUM(INV_PRICE) AS TOTAL_SALES
FROM INVOICE
GROUP BY EMP_ID
HAVING SUM(INV_PRICE) <= AVG(INV_PRICE);
我写了它,或者它被推荐在一段时间前,现在我不确定它是否在做我最初想要它做的事情。
我想要的是:我有一张包含价格和员工的发票表。 我想获得每个员工的总销售额,并将其与所有员工的平均总销售额进行比较。 从那里我希望结果显示哪些员工的销售额低于平均水平。
我上面的说法正确吗?
这是我运行 <= average 时得到的结果:
这是我跑 > 平均时得到的结果:
我认为我主要关心的是确保它计算出正确的平均值。 这是每个员工总和的平均值。
我上面的说法正确吗?
不。您的查询可能没有返回任何记录(仅返回有一次销售的记录)。 大多数情况下,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 AVG(INV_SUM)
FROM (
SELECT SUM(INV_PRICE) AS INV_SUM
FROM INVOICE
GROUP BY EMP_ID) x) ;
这里计算的平均值是针对所有员工的,而你是针对每个组计算的,这是没有意义的:总和不能超过任何给定组的平均值。
不,这不对。 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
) ;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.