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 的最佳方法