这是表格T
: -
id num
-------
1 50
2 20
3 90
4 40
5 10
6 60
7 30
8 100
9 70
10 80
以下是虚构 sql
select *
from T
where sum(num) = '150'
预期结果是: -
(A)
id num
-------
1 50
8 100
(B)
id num
-------
2 20
7 30
8 100
(C)
id num
-------
4 40
5 10
8 100
'A'案例是最优选的!
我知道这种情况与组合有关。
在现实世界中 - 客户从商店获取商品,并且由于他和商店之间的协议,他每周五付款。付款金额不是商品的确切总数 例如:他得到5本书50欧元(= 250欧元),周五他带150欧元,所以前3本书是完美匹配 - 3 * 50 = 150.我需要找到这3本书的身份证!任何帮助将不胜感激!
答案 0 :(得分:3)
您可以在MSSQL中使用递归查询来解决此问题。
第一个递归查询构建具有累积和< = 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 :(得分:1)
如果您将问题限制为“哪个 两个 数字加起来”,解决方法如下:
SELECT t1.id, t1.num, t2.id,t2.num
FROM T t1
INNER JOIN T t2
ON t1.id < t2.id
WHERE t1.num + t2.num = 150
如果您还想要三个或更多数字的结果,可以通过使用上述查询作为递归SQL的基础来实现。不要忘记指定最大递归深度!
答案 2 :(得分:0)
要查找客户支付的图书的ID,您需要与您的客户建立一个表,另一个用于存储客户的订单以及他购买的产品。
否则就无法知道付款所涉及的产品。