2010-04-13 83 views
4

我有一个SQL表下面的例子SELECT TOP N两个变量

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 

我想做些什么展示的是每个客户排在前两位的产品,每个组排序按销售下降即

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,我只是不知道如何完成这一举一动。

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

+1

顺便说一句,它是一个 '一举' ;-) HTTP: //www.phrases.org.uk/meanings/at-one-fell-swoop.html – 2010-04-13 08:25:08

+1

您使用的是哪个版本的SQL Server? – AdaTheDev 2010-04-13 08:28:13

+1

我喜欢那个矫正詹姆斯......我会很高兴地接受下巴,并从现在开始纠正其他人:) 这是目前在老派2000 Ada – 2010-04-13 08:30:36

回答

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(第一名这种情况下, )或1(第二名)。请注意,因此,如果您有超过2个值共享顶部位置(例如,3个A/1的销售额均为15),您将获得2个以上的结果。

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

+0

谢谢,这有助于另一个查询,我只是被要求帮助。 – 2010-04-13 10:09:29

+0

感谢CResults - 非常有用的一点SQL。 – 2010-04-13 11:11:19

0

这里是一个你需要2000上运行的SQL Server:

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 
+0

您的SQL2000查询不起作用 – CResults 2010-04-13 09:44:23

+0

当然,如果您已将数据插入到名为Test的表中,那么确实如此。 – odiseh 2010-04-13 10:07:24

+0

做下面的事情'插入测试值('A',1,20)'并且重新测试 – CResults 2010-04-13 10:18:48