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;
我正在从 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;