Group By 和 Have 子句描述

Posted

技术标签:

【中文标题】Group By 和 Have 子句描述【英文标题】:Group By and Having Clause description 【发布时间】: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);

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

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

我上面说的对吗?

这是我跑步时得到的结果

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

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

【问题讨论】:

测试时会发生什么?它做你想做的事吗? 我会上传一张我得到的更好的照片 > 和 【参考方案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
         ) ; 

【讨论】:

以上是关于Group By 和 Have 子句描述的主要内容,如果未能解决你的问题,请参考以下文章

LINQ to Sql 左外连接与 Group By 和 Have 子句

计算在JPA中使用“group by”和“have”过滤的行数

only_full_group_by : "ORDER BY 子句不在 GROUP BY 子句中"

选择描述字段而不将其包含在 GROUP BY 子句中时 GROUP BY id 的最佳方法

在连接中使用 Where 子句,以及 Group by 和 Order By

BigQuery 和 GROUP BY 子句