2010-11-15 32 views
5

Tanımlamak gerçekten garip bir sorundur, bu yüzden lütfen benimle çıplak ol.SQL dinamik kayıt sayısını seçin

SQL Server 2005'i kullanarak, kayıt sayısının ne olması gerektiğini almak için başka bir tabloya dayanarak bir tablodan belirli sayıda kayıt (dinamik) seçmeye çalışıyorum.

Tablo 1'de, bir Kategori Kimliği ve o kategori için geri dönmek istediğiniz kayıt sayısı vardır.

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 

Ben bir sorgu yazabilirsiniz nasıl bana Tablo 2'den doğru "top" ürün kayıtlarını alacak (:

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

Tablo 2 Ürün Kimliği, Kategori Kimliği ve Miktar vardır Bölüm 2, Bölüm 3 & 4, Bölüm 6)?

cevap

5

deneyin şey:

;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 bu harika çalıştı, teşekkürler !!! Row_number'i nasıl kullanacağımı anlamaya çalışıyordum, ama daha önce hiç bir zaman (bölüm ...) görmemiştim. – wham12

2

Bunu yapacağını düşünüyorum. Böyle

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 
İlgili konular