2010-11-15 18 views
5

Este es un problema realmente extraño de describir, así que por favor, desnudo conmigo.Selección de SQL número dinámico de registros

Al usar SQL Server 2005, intento seleccionar una cierta cantidad de registros (dinámicos) de una tabla, basados ​​en otra tabla para obtener el número necesario de registros.

La Tabla 1 tiene una ID de categoría y la cantidad de registros que deseo devueltos para esa categoría.

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

Tabla 2 tiene un identificador de producto, el identificador de categoría, y una Cantidad:

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 

¿Cómo puedo escribir una consulta que me llevará el "top" corregir los registros de productos de la Tabla 2 (Parte 2, Parte 3 & 4, Parte 6)?

Respuesta

5

intentar algo como esto:

;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 que funcionaba muy bien, gracias !!! Estaba intentando descubrir cómo usar row_number, pero nunca había visto el over (partition ...) antes. – wham12

2

Creo que esto lo hará.

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 
Cuestiones relacionadas