sql >> Databáze >  >> RDS >> Sqlserver

sql server:vyberte řádky, jejichž součet odpovídá hodnotě

K vyřešení tohoto problému můžete použít rekurzivní dotaz v MSSQL.

Ukázka SQLFiddle

První rekurzivní dotaz vytvoří strom položek s kumulativním součtem <=150. Druhý rekurzivní dotaz vezme listy s kumulativním součtem =150 a vypíše všechny takové cesty ke kořenům. Také v konečných výsledcích seřazených podle ItemsCount takže nejprve získáte preferované skupiny (s minimálním počtem položek).

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. MySQL Otázka ohledně plánování

  2. Oprava „Aritmetická chyba přetečení při převodu IDENTITY na datový typ…“ v SQL Server

  3. PHP:mysql_fetch_array() očekává, že parametr 1 bude zdrojem, zadaný booleovsky

  4. Převeďte juliánské datum na kalendářní datum v Postgresql