2010-11-15 33 views
5

Đây là một vấn đề thực sự kỳ lạ để mô tả, vì vậy xin vui lòng trần với tôi.SQL chọn số lượng hồ sơ động

Sử dụng SQL Server 2005, tôi đang cố chọn một số bản ghi (động) nhất định từ một bảng, dựa trên một bảng khác để có được số lượng bản ghi cần phải có.

Bảng 1 có ID danh mục và số lượng bản ghi tôi muốn được trả lại cho danh mục đó.

Category ID TOP_Limit 
---------------------- 
Cat 1  1 
Cat 2  2 
Cat 3  10 

Bảng 2 có một ID sản phẩm, các loại ID và Số lượng:

Product ID Category ID Quantity 
--------------------------------- 
Part 1  Cat 1  10 
Part 2  Cat 1  20 
Part 3  Cat 2  100 
Part 4  Cat 2  100 
Part 5  Cat 2  50 
Part 6  Cat 3  5 

Làm thế nào tôi có thể viết một truy vấn mà sẽ làm cho tôi hồ sơ sản phẩm "top" đúng từ Bảng 2 (Phần 2, Phần 3 & 4, Phần 6)?

Trả lời

5

Hãy thử một cái gì đó như thế này:

;with cte as (
    select ProductID, CategoryID, Quantity, 
     [row] = row_number() over(partition by CategoryID order by Quantity desc) 
    from Table2 
) 
select t2.Product, t2.CategoryID, t2.Quantity 
from cte t2 
    join Table1 t1 on t2.CategoryID=t1.CategoryID 
where t2.row <= t1.TOP_Limit 
+0

Hey mà làm việc tuyệt vời, nhờ !!! Tôi đã cố gắng tìm ra cách sử dụng row_number, nhưng tôi chưa bao giờ nhìn thấy trên (phân vùng ...) trước đây. – wham12

2

Tôi nghĩ rằng điều này sẽ làm điều đó.

declare @Table1 table (
    Cat int, 
    TOP_Limit int 
) 

declare @Table2 table (
    Part int, 
    Cat int, 
    Quantity int 
) 

insert into @Table1 
    (Cat, TOP_Limit) 
    select 1,1 union all 
    select 2,2 union all 
    select 3,10 

insert into @Table2 
    (Part, Cat, Quantity) 
    select 2,1,20 union all 
    select 3,2,100 union all 
    select 4,2,100 union all 
    select 5,2,50 union all 
    select 6,3,5 

;with cteRowNums as (
    select t2.Part, t2.Cat, t2.Quantity, 
      ROW_NUMBER() over(partition by t2.Cat order by t2.Quantity desc, t2.Part) as rownum 
     from @Table2 t2 
      inner join @Table1 t1 
       on t2.Cat = t1.Cat 
) 
select c.Part, c.Cat, c.Quantity 
    from cteRowNums c   
     inner join @Table1 t1 
      on c.Cat = t1.Cat 
       and c.rownum <= t1.TOP_Limit 
Các vấn đề liên quan