1

我试图弄清楚这段代码是怎么回事:

SELECT EMP_ID, SUM(INV_PRICE) AS TOTAL_SALES
FROM INVOICE
GROUP BY EMP_ID
HAVING SUM(INV_PRICE) <= AVG(INV_PRICE);

我写了它,或者建议在不久前写它,现在我不确定它是否在做我最初想要它做的事情。

我想要什么:我有一张包含价格和员工的发票表。我想获得每个员工的总销售额,并将其与所有员工的平均总销售额进行比较。从那里我希望结果显示哪些员工的销售额低于平均水平。

我上面的内容正确吗?

这是我运行 <= 平均时得到的结果:

在此处输入图像描述

这是我运行>平均时得到的结果:

在此处输入图像描述

我认为我主要关心的是确保它正在计算正确的平均值。这是每个员工总和的平均值。

4

3 回答 3

3

我上面的内容正确吗?

不,您的查询可能没有返回任何记录(只有一次销售的记录)。sum(inv_price) 在大多数情况下大于或等于任何给定组的 avg(inv_price)。

您想预先计算另一个查询中的平均值。

于 2012-11-25T23:25:59.200 回答
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) ;

此处计算的平均值是针对所有员工的,而您是针对每个组计算的,这是没有意义的:总和不能超过任何给定组的平均值。

于 2012-11-25T23:30:47.973 回答
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
         ) ; 
于 2012-11-25T23:35:14.970 回答