SQL 查询 Adventure Work 数据库时出错

Error in SQL query on Adventure Work database

我正在从 Beginning Microsoft SQL Server® 2008 Programming 一书中寻找问题的解决方案。(使用 AdventureWorks 数据库)

问题> 显示在 AdventureWorks 花费超过 70,000 美元的帐号购买的最近五个订单。

我在 See query 上找到了解决这个问题的方法,但这不起作用。这个查询有什么错误?

SELECT ss.AccountNumbeR, OrderDate
FROM Sales.SalesOrderHeader ss
WHERE ss.TotalDue > 70000
AND ss.AccountNumber NOT IN (SELECT TOP 5 ss.AccountNumber
            FROM Sales.SalesOrderDetail so
            JOIN Sales.SalesOrderHeader ss
            ON SO.SalesOrderID = ss.SalesOrderID
            HAVING SUM(so.LineTotal > 70000))
GROUP BY ss.TotalDue, ss.AccountNumber, OrderDate 
ORDER BY OrderDate DESC

我不完全确定为什么这个查询 有效:

查询的是前5个账号不是的订单,和我们想要的相反,而且TOP 5这里没有排序所以是完全随机的。而且这完全是在错误的地方,问题是要前5个订单,而不是前5个帐户。

它还会过滤每个订单的价值都大于 70000 的订单。HAVING SUM(so.LineTotal > 70000) 是一个语法错误。

我建议您在这里使用 window 函数

SELECT s.AccountNumber, s.OrderDate
FROM (
    SELECT so.*,
        TotalPerAccount = SUM(ss.LineTotal) OVER (PARTITION BY so.AccountNumber),
        rn = ROW_NUMBER() OVER (PARTITION BY so.AccountNumber ORDER BY so.OrderDate DESC)
    FROM Sales.SalesOrderHeader so
    JOIN Sales.SalesOrderDetail ss ON so.SalesOrderID = ss.SalesOrderID
) s
WHERE s.TotalPerAccount > 70000
  AND s.rn <= 5;

db<>fiddle