SQL Server 进行总数匹配(搜索哪些明细的和等于指定总数)
来源:互联网 发布:梦泰网络香港上市 编辑:程序博客网 时间:2024/05/07 03:50
这个帖子要求总数匹配,用其它语言也写过,也算比较典型的需求了,写成博客以免以后搜不到。
总数匹配没有什么高效的算法,只能靠深度优先的算法进行尝试。
-- 测试数据DECLARE @table1 TABLE(a varchar(10), qty int)INSERT INTO @table1(a,qty)SELECT 'A1',2 UNION ALLSELECT 'A2',3 UNION ALLSELECT 'A3',4 UNION ALLSELECT 'A4',5-- SP参数 --DECLARE @sum intSET @sum = 10-- SP内容 ---- 待选序列,每个成员有选中/不选两种状态,可以看成一棵二叉树DECLARE @t1 TABLE(rn int,a varchar(10), qty int)-- 已选序列,上面这颗二叉树的某条路径上的选中节点,方便回溯和切换路径。DECLARE @t2 TABLE(rn int,a varchar(10), qty int) -- 把qty按降序排列,有机会用更少的记录匹配出结果INSERT INTO @t1SELECT ROW_NUMBER() OVER(ORDER BY qty DESC), a, qty FROM @table1 WHERE qty <= @sum -- 先过滤掉不可能的数DECLARE @remain_sum int -- 剩余需要分配的和DECLARE @max_rn intDECLARE @last_rn intDECLARE @qty intSET @remain_sum = @sumSET @max_rn = (SELECT MAX(rn) FROM @t1)SET @last_rn = 0WHILE (@last_rn < @max_rn) AND (@remain_sum > 0)BEGIN -- 找路径中的下一个可选中节点 INSERT INTO @t2 SELECT TOP 1 * FROM @t1 WHERE rn > @last_rn -- 方向是向下的 AND qty <= @remain_sum -- 快速剪枝 IF (@@ROWCOUNT <> 0) BEGIN -- 有,继续向下 SET @last_rn = (SELECT MAX(rn) FROM @t2) SELECT @qty = qty FROM @t2 WHERE rn = @last_rn SET @remain_sum = @remain_sum - @qty END ELSE BEGIN -- 没有,回溯 SET @last_rn = (SELECT MAX(rn) FROM @t2) SELECT @qty = qty FROM @t2 WHERE rn = @last_rn SET @remain_sum = @remain_sum + @qty DELETE @t2 WHERE rn = @last_rn END END-- 结果SELECT * FROM @t2 WHERE @remain_sum = 0 -- 只有和全部分配了的才是结果。 -- 比如 @sum = 15 时,序列和才 14,不是结果。
结果数据
rn a qty----------- ---------- ----------- 1 A4 5 3 A2 3 4 A1 2
0 0
- SQL Server 进行总数匹配(搜索哪些明细的和等于指定总数)
- SQL Server快速获取表的记录总数
- SQL Server技巧之快速得到表的记录总数
- MS SQL Server分页通用存储过程(获取每一页和记录总数)
- 按总数排名的SQL
- Sql 求两列去重后的总数量
- SQL 获取一张表列的总数
- 求表中数据占总数百分比的SQL
- sql获取记录总数
- sql计算总数
- destoon产品总数,求购总数,供应总数的标注显示
- MS SQL SERVER中如何快速获取表的记录总数
- 待字闺中之正数数组内和为指定数字的总数
- 待字闺中之正数数组内和为指定数字的总数
- 删除和计算总数
- 兔子的总数问题
- Oracle查看某个用户下所有表的记录总数和所有表的字段总数
- 普通深度优先搜索(方法总数)模板简介
- 树状数组学习笔记
- 【human nature】:马云的故事
- The Chromium Embedded Framework (CEF)
- 整合大量开源库项目(七)ListView迁移成 RecyclerView
- 对属性的保护---- SEAndroid in Android5.x
- SQL Server 进行总数匹配(搜索哪些明细的和等于指定总数)
- 一个汉字等于多少个varchar2
- Ext.js问题重现整理(3)(combo)
- 关于 tomcat 集群中 session 共享的三种方法
- java 链表基本操作
- 手机蓝牙通讯
- Javascript的DOM操作
- c语言中内存管理
- tomcat与android应用端口交互问题