2010-08-31 44 views
6

Sql Server中显示的项目我有一个项目列表在特定的顺序

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 

OUTPUT:

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

这是对的,我认为你的订单是错误的。 – 2010-08-31 18:30:54

+0

+1:打我吧 – 2010-08-31 18:32:19

+0

@Paul Hadfield,是的,我只是在SQL2005中增加了'DESC'到ORDER BY – 2010-08-31 18:32:52

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:但使用此方法时存在重叠值的关系的风险。 – 2010-08-31 18:40:51

0

使用KM的帖子我认为他有接近你想要什么,但按照正确的顺序

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