我在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,我只是不确定如何一举完成这个。
为厚厚的问题道歉......没有任何借口。谢谢你的帮助。
答案 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