Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

sql сървър:изберете редове, чиято сума съвпада със стойност

Можете да използвате рекурсивна заявка в MSSQL, за да разрешите това.

Демо на SQLFiddle

Първата рекурсивна заявка изгражда дърво от елементи с кумулативна сума <=150. Втората рекурсивна заявка взема листове с кумулативна сума =150 и извежда всички такива пътища до корените. Също така в крайните резултати, подредени по ItemsCount така че първо ще получите предпочитани групи (с минимален брой елементи).

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Изпълнение на SSIS пакет като задание на SQLAgent

  2. ПРОВЕРЯТЕ Ограниченията в SQL Server

  3. Схема на SQL сървър и схема по подразбиране

  4. Шифроване на таблици на база данни в SQL Server 2008

  5. Получаване на подданни от списък със съоръжения