Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

máy chủ sql:chọn các hàng mà tổng của phù hợp với một giá trị

Bạn có thể sử dụng truy vấn đệ quy trong MSSQL để giải quyết vấn đề này.

Bản trình diễn SQLFiddle

Truy vấn đệ quy đầu tiên xây dựng một cây các mục có tổng tích lũy <=150. Truy vấn đệ quy thứ hai lấy các lá có tổng tích lũy =150 và xuất tất cả các đường dẫn như vậy đến gốc của nó. Cũng trong kết quả cuối cùng được sắp xếp theo ItemsCount vì vậy bạn sẽ nhận được các nhóm ưu tiên (với số lượng mục tối thiểu) trước tiên.

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. SQL Server 2016:Tạo một dạng xem

  2. DESC và ASC như một tham số trong thủ tục được lưu trữ

  3. tìm kiếm sql từ chuỗi csv

  4. Triển khai quan hệ một-không-một trong SQL Server

  5. Làm cách nào để kết nối với cơ sở dữ liệu MSSQL bằng mô-đun DBI của Perl trong Windows?