繁体   English   中英

分组依据和具有子句说明

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM