Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL-Server:Wählen Sie Zeilen aus, deren Summe mit einem Wert übereinstimmt

Sie können die rekursive Abfrage in MSSQL verwenden, um dies zu lösen.

SQLFiddle-Demo

Die erste rekursive Abfrage erstellt einen Baum von Elementen mit der kumulativen Summe <=150. Die zweite rekursive Abfrage nimmt Blätter mit der kumulativen Summe =150 und gibt alle diese Pfade zu ihren Wurzeln aus. Auch in den Endergebnissen geordnet nach ItemsCount Sie erhalten also zuerst bevorzugte Gruppen (mit minimaler Anzahl von Elementen).

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