sql >> Databasteknik >  >> RDS >> Sqlserver

sql-server:välj rader vars summa matchar ett värde

Du kan använda rekursiv fråga i MSSQL för att lösa detta.

SQLFiddle-demo

Den första rekursiva frågan bygger ett träd av objekt med kumulativ summa <=150. Den andra rekursiva frågan tar blad med kumulativ summa =150 och matar ut alla sådana vägar till dess rötter. Även i slutresultaten sorterade efter ItemsCount så du får föredragna grupper (med minimalt antal objekt) först.

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. Distribuera en Percona-server till ett hybridmoln

  2. Skickar tabellnamnet som parameter för förberedd sats

  3. Automatisera Databas Test Restore i SQL Server

  4. mysql triggerproblem i fel schema