【问题标题】:Group By and Having Clause descriptionGroup By 和 Have 子句描述
【发布时间】:2012-11-25 23:17:30
【问题描述】:

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

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

这是我写的,或者是不久前被推荐的,现在我不确定它是否在做我最初想要它做的事情。

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

我上面说的对吗?

这是我跑步时得到的结果

这是我跑步时得到的结果>平均:

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

【问题讨论】:

  • 测试时会发生什么?它做你想做的事吗?
  • 我会上传一张我得到的更好的照片 > 和

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


【解决方案1】:

我上面说的对吗?

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

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

【讨论】:

    【解决方案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) ;
    

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

    【讨论】:

    • 以上获取每张发票的平均值。我想要得到的是员工之间的关系如何。如果你说它没有意义,也许我应该重新考虑我想要做什么:/
    • @Bohemian:这不是 OP 想要的。考虑一下:所有销售人员都有INV_PRICE = 100,但有些员工做了很多,而其他人只做了一个。您拥有的(SELECT AVG(INV_PRICE) FROM INVOICE) 将显示100,当然许多员工的总销售额要多得多(因此每个员工的平均总销售额也将超过 100)。
    • 谢谢,这正是我想要做的。
    • @ypercube 明白了。现在检查我的答案。谢谢
    【解决方案3】:

    不,不是。 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
             ) ; 
    

    【讨论】:

      猜你喜欢
      • 2021-10-21
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      • 2015-02-28
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多