由于某些原因,聚合函数在连接中无法正常工作
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 行。(((当我单独运行小脚本时,我得到正确的总和。以上是关于由于某些原因,聚合函数在连接中无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章