2010-04-13 7 views
4

je l'exemple suivant dans une table SQLSELECT TOP N avec deux variables

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 

Ce que je voudrais montrer est les 2 premiers produits par client, par groupe classement descendant par les ventes à savoir

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 

Je suppose que j'ai besoin de déclarer deux variables, Cust et Group, je ne suis pas sûr de savoir comment le faire d'un seul coup.

Toutes mes excuses pour la question épaisse ... aucune excuse. Merci pour toute aide.

+1

Soit dit en passant, est un 'coup' ;-) http: //www.phrases.org.uk/meanings/at-one-fell-swoop.html –

+1

Quelle version de SQL Server utilisez-vous? – AdaTheDev

+1

J'aime cette correction James ... Je vais heureusement prendre cela sur le menton et corriger tout le monde à partir de maintenant:) Ceci est actuellement sur old school 2000 Ada –

Répondre

2

Salut les œuvres suivantes 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 

La Select Count(*) intérieure requête fonctionne en comptant le nombre d'enregistrements sont au-dessus du dossier, il est à la recherche actuellement - dans ce cas, vous voulez qu'il y b soit 0 (1ère place) ou 1 (2ème place).

Notez que pour cette raison, si vous avez plus de 2 valeurs partageant la première place (par exemple 3 A/1 avec des ventes de 15), vous obtiendrez plus de 2 résultats en arrière. Cependant, pour votre ensemble de test, il renvoie les résultats corrects et l'utilisation de DISTINCT vous aidera si vous préférez obtenir moins de résultats au lieu de plus de résultats dans cette instance. De plus, si vos enregistrements ont un enregistrement distinct, cela peut vous aider à choisir entre eux.

+0

Merci, cela m'a aidé dans une autre requête que je viens de demander à aider à. –

+0

Merci CResults - bit très utile de SQL que. –

0

Voici un dont vous avez besoin en cours d'exécution sur 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 

son équivalence en cours d'exécution sur 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

Votre requête SQL2000 ne fonctionne pas – CResults

+0

Bien sûr, si vous avez inséré les données dans une table appelée Test. – odiseh

+0

Effectuez les opérations suivantes 'INSERT INTO Test ('A', 1,20) et' re test – CResults