我一直在编写一个查询来查找每个订单的总销售额,并返回前10个最高金额的关系。所以,我写了这个查询
select OrderID,
SUM((UnitPrice-Discount/100)*quantity) as TotalSale,
dense_rank() over(order by TotalSale desc) as rnk
from dbo.[Order Details]
where rnk <= 10
GROUP BY ORDERID
ORDER BY TotalSale DESC
所以,当我运行这个时,我得到错误,说rnk和totalsale是无效列。如果我删除dense_rank(),查询将返回值。你可以帮我解决这个错误。
答案 0 :(得分:1)
您无法在同一查询中引用窗口函数,需要提供子查询。您也无法通过别名引用TotalSale
,您必须再次使用该计算。
WITH ranked AS
(
SELECT OrderID
, SUM( (UnitPrice - Discount / 100) * quantity) AS TotalSale
, dense_rank() OVER (ORDER BY SUM( (UnitPrice - Discount / 100) * quantity) DESC) AS rnk
FROM dbo.[Order Details]
)
SELECT OrderID, TotalSale
FROM ranked
WHERE rnk <= 10
GROUP BY OrderID
ORDER BY TotalSale DESC
答案 1 :(得分:1)
在OVER()函数的上下文中不存在TotalSale。试试这个:
select * from (
select
OrderID,
SUM((UnitPrice-Discount/100)*quantity) as TotalSale,
dense_rank() over(order by SUM((UnitPrice-Discount/100)*quantity) desc) as rnk
from dbo.[Order Details]) oDetails
where rnk <= 10
GROUP BY ORDERID
ORDER BY TotalSale DESC
答案 2 :(得分:0)
你可以摆脱rnk并使用top子句。
答案 3 :(得分:0)
为什么不使用'TOP 10'关键字而不是使用排名?
SELECT TOP 10 ORDERID, SUM((UnitPrice-Discount/100)*quantity) as TotalSale
FROM <table>
etc...
答案 4 :(得分:0)
select TOP 10 OrderID,SUM((UnitPrice-Discount/100)*quantity) as TotalSale
from dbo.[Order Details]
GROUP BY ORDERID
ORDER BY SUM((UnitPrice-Discount/100)*quantity) DESC
或
SELECT OrderID, TotalSale
FROM (
SELECT OrderID
, SUM((UnitPrice-Discount/100)*quantity) AS TotalSale
, dense_rank() over(order by TotalSale desc) AS rnk
FROM dbo.[Order Details]
) AS X
WHERE rnk <= 10
GROUP BY OrderID
ORDER BY TotalSale DESC
答案 5 :(得分:0)
select OrderId, sum((UnitPrice-Discount/100)*quantity) as TotalSale
from [Order Details] od join
(
select top 10 TotalSale from
(
select distinct sum((UnitPrice-Discount/100)*quantity) as TotalSale
from [Order Details]
group by orderid
order by TotalSale desc
) sales
) topsales on od.TotalSale = topsales topsales.TotalSale
group by orderid
order by TotalSale desc
基本上,您需要找出前十个不同数量的数据。然后,您可以查找与前十个金额中的任何一个相匹配的所有金额。