Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

sql server :pilih baris yang jumlahnya cocok dengan nilai

Anda dapat menggunakan kueri rekursif di MSSQL untuk menyelesaikan ini.

Demo SQLFiddle

Kueri rekursif pertama membangun pohon item dengan jumlah kumulatif <=150. Kueri rekursif kedua mengambil daun dengan jumlah kumulatif =150 dan menampilkan semua jalur tersebut ke akarnya. Juga di hasil akhir yang dipesan oleh ItemsCount jadi Anda akan mendapatkan grup pilihan (dengan jumlah item minimal) terlebih dahulu.

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. Bagaimana COUNT_BIG() Bekerja di SQL Server

  2. Persiapan yang ditangguhkan tidak dapat diselesaikan kesalahan saat menggunakan database lokal sebagai server tertaut

  3. T-SQL:memeriksa format email

  4. Bagaimana cara mengatur database default di Sql Server dari kode?

  5. Di SQL Server, bagaimana saya bisa mengunci satu baris dengan cara yang mirip dengan Oracle SELECT FOR UPDATE WAIT?