2012-09-27 61 views
9

我有一个SQL表中的下列数据SELECT TOP N具有可变

临时表变量@RndQuesnCount包含此数据,

Recid conceptID MinDisplayCount 
1  3839  2 
2  4802  3 

问表:QuesTable

QuesCompID  Ques_ConceptDtlID 
    88   4802 
    89   4802 
    90   4802 
    91   4802 
    92   4802 
    93   4802 

我会想要显示的是概念编号为@RndQuesnCount的问题的最小显示数,所以现在的数据应该如下

QuesCompID Ques_ConceptDtlID 
    88   4802 
    89   4802 
    90   4802 

因为conceptid(4802)具有分显示计数3 @RndQuesnCount表。

任何人都可以帮助我解决这个问题吗?

回答

8

使用简单ROW_NUMBER()和加入得到的结果,我想。数据设置:

declare @RndQuesnCount table (recid int,conceptid int,mindisplaycount int) 
insert into @RndQuesnCount(Recid,conceptID,MinDisplayCount) values 
(1,  3839,  2), 
(2,  4802,  3) 

declare @QuesTable table (QuesCompID int,Ques_ConceptDtlID int) 
insert into @QuesTable(QuesCompID,Ques_ConceptDtlID) values 
(88,   4802), 
(89,   4802), 
(90,   4802), 
(91,   4802), 
(92,   4802), 
(93,   4802) 

查询:

select 
    t.rn, 
    t.QuesCompID, 
    t.Ques_ConceptDtlID 
from 
    @RndQuesnCount rqc 
     inner join 
    (select *,ROW_NUMBER() OVER (PARTITION BY Ques_ConceptDtlID ORDER BY QuesCompID) rn from @QuesTable) t 
     on 
      rqc.conceptID = t.Ques_ConceptDtlID and 
      rqc.MinDisplayCount >= t.rn 

结果:

rn     QuesCompID Ques_ConceptDtlID 
-------------------- ----------- ----------------- 
1     88   4802 
2     89   4802 
3     90   4802 
2

尝试:

declare @RndQuesnCount int; 

select @RndQuesnCount=MinDisplayCount 
from table_variable where conceptID=4802; 

set rowcount @RndQuesnCount; 

select * from QuesTable; 
+0

没有硬编码值,我需要从列名 –

+0

我编辑我的回答从table_variable动态获取@RndQuesnCount值获取值。 – Habibillah

2

试试这个:

;WITH cte as 
    ( select *,row_number() over(order by QuesCompID) as row_num 
     from QuesTable 
     join @RndQuesnCount 
     on  Ques_ConceptDtlID=conceptID) 
SELECT QuesCompID,Ques_ConceptDtlID 
FROM cte 
WHERE row_num<=MinDisplayCount 

结果:

QuesCompID Ques_ConceptDtlID 
88    4802 
89    4802 
90    4802