我正在從《Beginning Microsoft SQL Server? 2008 Programming》一書中尋找解決問題的方法。(使用了 AdventureWorks 資料庫)
問題> 顯示最近五個從在 AdventureWorks 上花費超過 70,000 美元的帳號購買的訂單。
我在查看查詢中找到了解決方案,但這不起作用。這個查詢有什么錯誤?
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
uj5u.com熱心網友回復:
我不完全確定你為什么這個查詢會起作用:
查詢的是帳號不在前5位的訂單,這與我們想要的相反,而且TOP 5這里沒有排序,所以完全是隨機的。這完全是在錯誤的地方,問題想要前 5 個訂單,而不是前 5 個帳戶。
它還過濾每個訂單單獨具有大于 70000 的值的訂單。并且HAVING SUM(so.LineTotal > 70000)是語法錯誤。
我建議您改用這里的視窗函式
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<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/415071.html
標籤:
