スタートです。パフォーマンスが低下します。
declare @Qs table (QuestionID int not null, QuestionMarks int not null)
insert into @Qs (QuestionID,QuestionMarks) values
(1,1), (2,4), (5,1), (9,1), (12,2)
declare @TargetMarks int = 8
declare @TargetCount int = 4
;with Build as (
select QuestionID as MinID,QuestionID as MaxID,QuestionMarks as Total,1 as Cnt
,'/' + CONVERT(varchar(max),QuestionID) + '/' as QPath
from @Qs
union all
select MinID,q.QuestionID,Total+q.QuestionMarks,Cnt+1,QPath + CONVERT(varchar(max),q.QuestionID) + '/'
from
Build b
inner join
@Qs q
on
b.MaxID < q.QuestionID and
b.Total + q.QuestionMarks <= @TargetMarks and
b.Cnt < @TargetCount
)
select * from Build where Cnt = @TargetCount and Total = @TargetMarks
結果セット:
MinID MaxID Total Cnt QPath
--------------------------------------------------------------------------------
2 12 8 4 /2/5/9/12/
1 12 8 4 /1/2/9/12/
1 12 8 4 /1/2/5/12/
注意が必要なのは、QPath 値が ID 値を格納する最適な方法ではないことです。