SELECT TOP N有两个变量

时间:2010-04-13 08:22:59

标签: sql tsql sql-server-2000

我在SQL表中有以下示例

Cust Group Sales
A   1   15
A   1   10
A   1   5
A   2   15      
A   2   10
A   2   5
B   1   15
B   1   10
B   1   5
B   2   15
B   2   10  
B   2   5

我希望展示的是每位客户的前2名产品,每组按销售额降序排列,即

Cust Group Sales
A   1   15
A   1   10
A   2   15      
A   2   10
B   1   15
B   1   10
B   2   15
B   2   10

我假设我需要声明两个变量,Cust和Group,我只是不确定如何一举完成这个。

为厚厚的问题道歉......没有任何借口。谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

以下是MSSQL2000中的工作

 SELECT tbl.Cust,
        tbl.Group,
        tbl.Sales

 FROM   MyTable tbl

 WHERE (SELECT COUNT(*) 
        FROM   MyTable tbl2 
        WHERE  tbl2.Sales > tbl.Sales 
        AND    tbl2.Group = tbl.Group 
        AND    tbl2.Cust = tbl.Cust) < 2

 ORDER  BY     tbl.Cust ASC, 
               tbl.Group ASC, 
               tbl.Sales DESC

内部Select Count(*)查询的工作原理是计算当前正在查看的记录数量以上的记录数量 - 在这种情况下,您希望b在0(第一位)或第一位(第二位)。

请注意,因此,如果您有超过2个值共享最高点(例如3个A / 1的所有销售额为15),您将获得超过2个结果。

但是,对于您的测试集,它会返回正确的结果,如果您希望在此实例中获得更少而不是更多结果,则使用DISTINCT会有所帮助。此外,如果您的记录具有不同的记录,则可以帮助您在它们之间做出决定。

答案 1 :(得分:0)

这是您需要在SQL Server 2000上运行的那个:

select distinct t1.Cust, t1.GroupID, t1.Sale 
from Test t1 inner join Test t2 on t1.Cust = t2.Cust and t1.GroupID = t2.GroupID
where t1.Sale>t2.Sale
order by Cust, GroupID, Sale desc

它在SQL Server 2005+上的等效性:

select Cust, GroupID, Sale
from (
    SELECT *, rank() over(partition by Cust, GroupID order by sale desc) as n 
    FROM dbo.Test
     ) dt
where dt.n<=2
order by Cust, GroupID, Sale desc