分组和有条款说明

时间:2012-11-25 23:17:30

标签: sql ms-access group-by nested-queries

我试图弄清楚这段代码的用途:

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

我写了它或建议在一段时间之前,现在我不确定它是否做了我原本希望它做的事情。

我想要的是:我有一张价格和员工的发票表。我想让每个员工的总销售额与所有员工的平均总销售额进行比较。从那里我希望结果能够告诉我哪些员工的销售低于平均水平。

我上面的内容是否正确?

这是我在运行&lt; = average:

时得到的结果

enter image description here

以下是我运行时获得的&gt;平均:

enter image description here

我认为我的主要关注点是确保它正在计算正确的平均值。这是每位员工的平均金额。

3 个答案:

答案 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
         ) ;