2010-08-31 1 views
6

j'ai une liste d'articlesSql Server Affichage des éléments dans l'ordre spécifique

ItemName Fabricant TopSalesUnit

Item1  A    100 
Item2  A    80      
Item3  A    60 
Item4  B    70 
Item5  B    50 
Item6  B    30 
Item7  C    10  
Item8  C    05 

Je souhaite que les dossiers à l'ordre afin que le plus haut point de TopSalesUnit est affiché en premier, alors le plus élevé suivant un objet d'un autre fabricant est représenté secondes, alors le plus élevé suivant l'élément de un troisième fabricant est représenté, etc .:

ItemName Fabricant TopSalesUnit

Item1  A    100  
Item4  B    070 
Item7  C    010 
Item2  A    080 
Item5  B    050 
Item8  C    005 
Item3  A    060 
Item6  B    030 

Comment écrire une requête dans T-SQL pour y parvenir?

Répondre

8

essayer:

DECLARE @YourTable table (ItemName varchar(10), Manufacturer char(1), TopSalesUnit int) 

INSERT @YourTable VALUES ('Item1','A ',100) 
INSERT @YourTable VALUES ('Item2','A ',80)     
INSERT @YourTable VALUES ('Item3','A ',60) 
INSERT @YourTable VALUES ('Item4','B ',70) 
INSERT @YourTable VALUES ('Item5','B ',50) 
INSERT @YourTable VALUES ('Item6','B ',30) 
INSERT @YourTable VALUES ('Item7','C ',10)  
INSERT @YourTable VALUES ('Item8','C ',05) 

SELECT 
    dt.ItemName,dt.Manufacturer,dt.TopSalesUnit 
    FROM (SELECT 
       ItemName,Manufacturer,TopSalesUnit,ROW_NUMBER() OVER(PARTITION BY Manufacturer ORDER BY TopSalesUnit DESC) AS RowNumber 
       FROM @YourTable 
     ) dt 
    ORDER BY dt.RowNumber,dt.Manufacturer 

SORTIE:

ItemName Manufacturer TopSalesUnit 
---------- ------------ ------------ 
Item1  A   100 
Item4  B   70 
Item7  C   10 
Item2  A   80 
Item5  B   50 
Item8  C   5 
Item3  A   60 
Item6  B   30 

(8 row(s) affected) 
+0

Est-ce tout à fait raison, je pense que votre commande par est le mauvais chemin. –

+0

+1: Battez-moi –

+0

@Paul Hadfield, Oui, je viens d'ajouter le 'DESC' à la commande par –

1

Essayez ceci:

SELECT *, 
    (SELECT COUNT(*) FROM Items b 
    WHERE b.Manufacturer = Items.Manufacturer 
    AND b.TopSalesUnit > Items.TopSalesUnit) 
    AS RankInManufacturer 
FROM Items 
ORDER BY RankInManufacturer, TopSalesUnit DESC 

Cela ajoute une nouvelle colonne calculée qui classe les champs « TopSalesUnit » dans chaque « fabricant ».

+0

+1: Cependant, il existe un risque que des liens aient des valeurs dupliquées lors de l'utilisation de cette méthode. –

0

Utiliser Post KM Je pense qu'il avait à ce que vous voulez, mais dans le bon ordre

DECLARE @YourTable table (ItemName varchar(10), Manufacturer char(1), TopSalesUnit int) 

INSERT @YourTable VALUES ('Item1','A ',100) 
INSERT @YourTable VALUES ('Item2','A ',80)     
INSERT @YourTable VALUES ('Item3','A ',60) 
INSERT @YourTable VALUES ('Item4','B ',70) 
INSERT @YourTable VALUES ('Item5','B ',50) 
INSERT @YourTable VALUES ('Item6','B ',30) 
INSERT @YourTable VALUES ('Item7','C ',10)  
INSERT @YourTable VALUES ('Item8','C ',05) 

select 
    ItemName 
    ,Manufacturer 
    ,TopSalesUnit 
    ,ROW_NUMBER() over (order by TopSalesUnit desc) as rn 
    ,rank() over (partition by manufacturer order by TopSalesUnit desc) as rankcost 
from 
    @YourTable 

order by rankcost, rn 

Résultats dans:

Item1 A 100 1 1 
Item4 B 70 3 1 
Item7 C 10 7 1 
Item2 A 80 2 2 
Item5 B 50 5 2 
Item8 C 5 8 2 
Item3 A 60 4 3 
Item6 B 30 6 3 
Questions connexes