2010-08-31 3 views
6

У меня есть список элементовSql сервера отображения элементов в определенном порядке

ItemName Производитель 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 

Я хотел бы записи, которые должны быть упорядочены таким образом, что наибольший элемент TopSalesUnit показан первый, затем отображается следующий наивысший элемент у другого производителя, затем отображается следующий самый высокий элемент от и т. д.

ItemName Производитель 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 

Как написать запрос в T-SQL, чтобы достичь этого?

ответ

8

попробовать:

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 

ВЫВОД:

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

Является ли это совершенно правильным, я думаю, что ваш порядок неправильным образом. –

+0

+1: Beat me to it –

+0

@Paul Hadfield, Да, я просто добавил 'DESC' к ORDER BY –

1

Попробуйте это:

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 

Это добавляет новый вычисляемый столбец, который ранжирует «TopSalesUnit» поля внутри каждого «Производитель».

+0

+1: Но при использовании этого метода существует риск связывания с повторяющимися значениями. –

0

Использование Post км, я думаю, что он был близок к тому, что вы хотите, но в правильном порядке

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 

Результаты в:

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 
Смежные вопросы