Bạn có thể sử dụng truy vấn đệ quy trong MSSQL để giải quyết vấn đề này.
Truy vấn đệ quy đầu tiên xây dựng một cây các mục có tổng tích lũy <=150. Truy vấn đệ quy thứ hai lấy các lá có tổng tích lũy =150 và xuất tất cả các đường dẫn như vậy đến gốc của nó. Cũng trong kết quả cuối cùng được sắp xếp theo ItemsCount
vì vậy bạn sẽ nhận được các nhóm ưu tiên (với số lượng mục tối thiểu) trước tiên.
WITH CTE as
( SELECT id,num,
id as Grp,
0 as parent,
num as CSum,
1 as cnt,
CAST(id as Varchar(MAX)) as path
from T where num<=150
UNION all
SELECT t.id,t.num,
CTE.Grp as Grp,
CTE.id as parent,
T.num+CTE.CSum as CSum,
CTE.cnt+1 as cnt,
CTE.path+','+CAST(t.id as Varchar(MAX)) as path
from T
JOIN CTE on T.num+CTE.CSum<=150
and CTE.id<T.id
),
BACK_CTE as
(select CTE.id,CTE.num,CTE.grp,
CTE.path ,CTE.cnt as cnt,
CTE.parent,CSum
from CTE where CTE.CSum=150
union all
select CTE.id,CTE.num,CTE.grp,
BACK_CTE.path,BACK_CTE.cnt,
CTE.parent,CTE.CSum
from CTE
JOIN BACK_CTE on CTE.id=BACK_CTE.parent
and CTE.Grp=BACK_CTE.Grp
and BACK_CTE.CSum-BACK_CTE.num=CTE.CSum
)
select id,NUM,path, cnt as ItemsCount from BACK_CTE order by cnt,path,Id