2010-08-31 29 views
6

Tôi có một danh sách các mụcSql Server Hiển thị mục theo thứ tự cụ thể

ITEMNAME Nhà sản xuất 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 

Tôi muốn các hồ sơ để được đặt hàng để các mục TopSalesUnit cao nhất được hiển thị đầu tiên, sau đó mục cao nhất tiếp theo từ một nhà sản xuất khác được hiển thị thứ hai, sau đó mục cao nhất tiếp theo từ nhà sản xuất thứ ba được hiển thị, v.v.

ItemName Nhà sản xuất 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 

Làm thế nào để viết truy vấn trong T-SQL để đạt được nó?

Trả lời

8

thử:

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

Điều đó có đúng không, tôi nghĩ đơn đặt hàng của bạn là sai đường. –

+0

+1: Đánh bại tôi với nó –

+0

@Paul Hadfield, Có, tôi vừa thêm 'DESC' vào ORDER BY –

1

Hãy thử điều này:

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 

này thêm một cột tính mới mà đứng "TopSalesUnit" lĩnh vực trong mỗi "Nhà sản xuất".

+0

+1: Nhưng có rủi ro về các mối quan hệ có giá trị trùng lặp khi sử dụng phương pháp này. –

0

Sử dụng bài viết KM của tôi nghĩ anh ấy đã gần với những gì bạn muốn nhưng theo thứ tự đúng

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 

Kết quả trong:

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 
Các vấn đề liên quan