SQL查询打印前10个最高计算量

时间:2011-11-15 03:12:46

标签: sql sql-server

我一直在编写一个查询来查找每个订单的总销售额,并返回前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(),查询将返回值。你可以帮我解决这个错误。

6 个答案:

答案 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

基本上,您需要找出前十个不同数量的数据。然后,您可以查找与前十个金额中的任何一个相匹配的所有金额。