由于某些原因,聚合函数在连接中无法正常工作

Posted

技术标签:

【中文标题】由于某些原因,聚合函数在连接中无法正常工作【英文标题】:Aggregatin function doesn't work correct in join for some reasons 【发布时间】:2020-03-31 19:38:51 【问题描述】:

我遇到了当前连接的问题。由于某些原因,聚合函数在其中返回不正确的数量。当我运行以下查询时,结果中没有任何行:

 SELECT 
   CONCAT( pp.FirstName, ' ', pp.LastName) AS 'CustomerName', 
   ssoh.Status AS 'OrderStatus',
   FORMAT (ssoh.OrderDate, 'yyyy-dd-MM') AS OrderDate, ItemCount, AvgQty
 FROM Sales.SalesOrderHeader AS ssoh
 JOIN Person.Person AS pp ON pp.BusinessEntityID = ssoh.CustomerID
 JOIN ( 
   SELECT SalesOrderID, SUM(ssod.OrderQty) AS ItemCount, AVG(ssod.OrderQty) AS AvgQty
   FROM Sales.SalesOrderDetail AS ssod
   GROUP BY ssod.SalesOrderID
   HAVING SUM(ssod.OrderQty) > 300 
 ) AS ssod ON ssoh.SalesOrderID = ssod.SalesOrderID
 ORDER BY ssod.ItemCount DESC

当我单独运行这个查询时:

Select SUM(OrderQty), SalesOrderID
From Sales.SalesOrderDetail
Where SUM(OrderQty) > 300
Group BY SalesOrderID
Order by desc
go

我得到了一些行,这意味着我的思维方式没有错,我在脚本中犯了一个错误。请帮帮我。

【问题讨论】:

有趣的 WHERE 子句与聚合甚至可以在第二个代码块中工作,因为它应该在 HAVING 中!请在这两种情况下测试相同聚合,并请定义不起作用返回不正确的金额SalesOrderID 的两倍/三倍? TSQL 错误(假设来自GO):An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference. 我单独运行了第二个脚本,以确保确实存在大于 300 的 SUM(OrgerQty)。我在结果中有十几行。当我运行第一个脚本时,我没有得到任何大于 8 的值(我删除了 HAVING 子句以查看 SUM 函数的结果)。 看看将 Inner join 转换为 Left join 是否有任何不同。 @AnkitBajpai 我已经尝试过这个选项。不幸的是,这没有任何区别。 【参考方案1】:

你需要使用have not where here:

Select SUM(OrderQty) as s, SalesOrderID
From Sales.SalesOrderDetail
Group BY SalesOrderID
HAVING SUM(OrderQty) > 300
Order by s desc

编辑以获得在 SQL Server 上工作的顺序

SELECT x.s, x.salesorderid
FROM (
  Select SUM(OrderQty) as s, SalesOrderID
  From Sales.SalesOrderDetail
  Group BY SalesOrderID
  HAVING SUM(OrderQty) > 300
) x
Order by x.s desc

【讨论】:

感谢您的回答。它与我脚本的最后一个连接匹配。 OrderQty 不能正常工作(总和不正确)。运行脚本后,我得到 0 行。(((当我单独运行小脚本时,我得到正确的总和。

以上是关于由于某些原因,聚合函数在连接中无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

ElasticSearch 聚合函数

为啥 SQL 中没有 PRODUCT 聚合函数?

错误 [HY000] 错误:聚合函数调用不能嵌套 */

在 Apache Druid 中使用 SQL 将聚合函数应用于某些列

嵌套聚合函数

在子查询中使用聚合和窗口函数