2010-04-13 82 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