Sql Server Отображение элементов в определенном порядке - PullRequest
6 голосов
/ 31 августа 2010

У меня есть список элементов

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 Manufacturer 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 для его достижения?

Ответы [ 3 ]

8 голосов
/ 31 августа 2010

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

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)
1 голос
/ 31 августа 2010

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

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 голосов
/ 31 августа 2010

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

    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...