2010-08-31 10 views
6

que tienen una lista de elementosSQL Server se muestran los elementos en orden específico

NombreDeElemento Fabricante 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 

Me gustaría que los registros a ser ordenados de manera que el elemento TopSalesUnit más alta se muestra por primera vez, luego se muestra el siguiente ítem más alto de un fabricante diferente, luego se muestra el siguiente artículo más alto de un tercer fabricante, etc .:

NombreDeElemento Fabricante 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 

Cómo escribir una consulta en T-SQL para lograrlo?

Respuesta

8

intento:

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 

SALIDA:

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

¿Tiene razón, creo que su orden es incorrecta? –

+0

+1: Muéstremelo –

+0

@Paul Hadfield, Sí, acabo de agregar el 'DESC' al ORDEN POR –

1

Prueba esto:

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 

Esto añade una nueva columna calculada que clasifica los campos "TopSalesUnit" dentro de cada "Fabricante".

+0

+1: Pero existe el riesgo de que las ligaduras tengan valores duplicados al usar este método. –

0

Usando Post KM Creo que tenía cerca de lo que usted quiere, pero en el orden correcto

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 

Resultados en:

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 
Cuestiones relacionadas