sql >> Database teknologi >  >> RDS >> Sqlserver

sql server:vælg rækker, hvis sum matcher en værdi

Du kan bruge rekursiv forespørgsel i MSSQL til at løse dette.

SQLFiddle-demo

Den første rekursive forespørgsel bygger et træ af elementer med kumulativ sum <=150. Anden rekursive forespørgsel tager blade med kumulativ sum =150 og udsender alle sådanne stier til dens rødder. Også i de endelige resultater sorteret efter ItemsCount så du får foretrukne grupper (med minimalt antal varer) 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. geoip postnummer forespørgsel

  2. natvagts brugerdefineret kommando tilbagekald

  3. psql indstillede standard statement_timeout som bruger i postgres

  4. PostgreSQL vælg værdi og stigning på én gang