sql >> Database >  >> RDS >> Sqlserver

sql-server:selecteer rijen waarvan de som overeenkomt met een waarde

U kunt recursieve zoekopdrachten in MSSQL gebruiken om dit op te lossen.

SQLFiddle-demo

De eerste recursieve query maakt een boomstructuur van items met cumulatieve som <=150. De tweede recursieve query neemt bladeren met cumulatieve som =150 en voert al dergelijke paden uit naar zijn wortels. Ook in de eindresultaten gerangschikt op ItemsCount dus je krijgt eerst voorkeursgroepen (met een minimaal aantal items).

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


  1. MAX vs Top 1 - wat is beter?

  2. MYSQL Tabel maken met standaardwaarde (expressie) naar een kolom

  3. mysql genereer ontbrekende datums met vorige waarde

  4. Hoe modelleer je overerving effectief in een database?