当前位置: 首页 > 面试题库 >

在SQL中,找到总和达到特定数量(或其他表中的amt)的行的组合

何安宜
2023-03-14
问题内容

表_1
D_ID整数
Deposit_amt整数

表_2
Total_ID
Total_amt整数

是否有可能写一个SELECT语句来找到所有的行Table_1,其Deposit_amt总和为Total_amtTable_2。两个表中都有多个行。

假设第一行中Table_2有一个Total_amt=100。我想知道,在Table_1与行D_ID2,6,12求和=
100,行D_ID2,3,42求和= 100,等。

帮助表示赞赏。让我知道是否需要澄清。

我问这个问题,因为某人作为工作的一部分,拥有交易清单和总计清单,她需要查找可能已创建总数的交易清单。我同意这听起来很危险,因为找到总计为一笔交易的组合并不能保证它们创建了一笔总数。

我不知道这是一个np完全问题。


问题答案:

只是为了好玩,我做了一个蛮力的解决方案。它将找到一个,两个或三个记录的总和Total_amt。您可以通过添加d4,子d5选择等将其扩展为处理每笔交易更多的事务:

begin tran

create table Table_1 (D_ID int, Deposit_amt int)
create table Table_2 (Total_ID int, Total_amt int)

insert into Table_1 (D_ID, Deposit_amt) values (1, 4)
insert into Table_1 (D_ID, Deposit_amt) values (2, 3)
insert into Table_1 (D_ID, Deposit_amt) values (3, 1)
insert into Table_1 (D_ID, Deposit_amt) values (4, 1)
insert into Table_1 (D_ID, Deposit_amt) values (5, 9)
insert into Table_1 (D_ID, Deposit_amt) values (6, 13)
insert into Table_1 (D_ID, Deposit_amt) values (7, 6)
insert into Table_1 (D_ID, Deposit_amt) values (8, 7)
insert into Table_1 (D_ID, Deposit_amt) values (9, 12)
insert into Table_1 (D_ID, Deposit_amt) values (10, 4)

insert into Table_2 (Total_ID, Total_amt) values (1, 17)
insert into Table_2 (Total_ID, Total_amt) values (2, 23)
insert into Table_2 (Total_ID, Total_amt) values (3, 55)
insert into Table_2 (Total_ID, Total_amt) values (4, 4)

select t.Total_amt, 
    d1.D_ID as d1_ID, d1.Deposit_amt as d1_amt, 
    d2.D_ID as d2_ID, d2.Deposit_amt as d2_amt, 
    d3.D_ID as d3_ID, d3.Deposit_amt as d3_amt
from Table_2 t
cross join (
    select D_ID, Deposit_amt from Table_1 
) d1
inner join (
    select D_ID, Deposit_amt from Table_1 
    union all
    select null, null
) d2 on d1.D_ID > d2.D_ID or d2.D_ID is null
inner join (
    select D_ID, Deposit_amt from Table_1 
    union all
    select null, null
) d3 on d2.D_ID > d3.D_ID or d3.D_ID is null
where isnull(d1.Deposit_amt, 0) + isnull(d2.Deposit_amt, 0) + isnull(d3.Deposit_amt, 0) = t.Total_amt
order by Total_amt

rollback tran

输出:

Total_amt   d1_ID       d1_amt      d2_ID       d2_amt      d3_ID       d3_amt
----------- ----------- ----------- ----------- ----------- ----------- -----------
4           3           1           2           3           NULL        NULL
4           4           1           2           3           NULL        NULL
4           1           4           NULL        NULL        NULL        NULL
4           10          4           NULL        NULL        NULL        NULL
17          9           12          3           1           1           4
17          9           12          4           1           1           4
17          10          4           5           9           1           4
17          8           7           7           6           1           4
17          6           13          1           4           NULL        NULL
17          10          4           6           13          NULL        NULL
17          10          4           8           7           7           6
17          8           7           5           9           4           1
17          10          4           9           12          4           1
17          8           7           5           9           3           1
17          10          4           9           12          3           1
17          6           13          3           1           2           3
17          6           13          4           1           2           3
23          8           7           6           13          2           3
23          6           13          5           9           3           1
23          6           13          5           9           4           1
23          10          4           7           6           6           13
23          10          4           9           12          8           7
23          7           6           6           13          1           4
23          9           12          8           7           1           4

(24 row(s) affected)

注意: 您可以过滤出其的各个行Deposit_amt > Total_amt,但是除非对其Deposit_amt进行索引,否则这可能对性能没有太大帮助。



 类似资料:
  • 问题内容: 我工作的一个SQL查询的表有两列,并应返回的总和列的值,直到达到它也应该返回的值列在该河段的排序条件为 例如,我的数据如下 在上表中,金额总计应在按日期排序之后进行计算,并且一旦金额达到5000分,应返回金额及其关联的日期的总计。 排序数据后,它变成如下所示 查询应返回以下结果 上述结果是因为总和达到在 我可以知道一种更好的方法来处理它吗 问题答案: 对于SQL Server,您可以使

  • 问题内容: 我在mySQL中有一个带有以下各列的表: TRANS_TYPE可以是“ DRINV”(销售)或“ DRCDT”(信用)。 我想获取每个客户的总销售额,因此到目前为止,我的查询是: 问题是这是销售 和 积分的总和,而不是销售减去积分。我希望结果是 是否可以在SQL查询中执行此操作? 问题答案:

  • 这一次我的头撞到了墙上。。。希望能得到一些帮助。 我将在下面用模拟数据解释一个例子,但本质上,我试图在其他变量的多个组合中最小化列的总和。 问:在每个和中,通过查看和中跑步者的不同组合,让中的所有跑步者完成比赛()的最快方法是什么? 下面数据集的每一行代表一场比赛的完整“跑步”。变量包括: 出发时团队跑步者:这一行数据中跑步和计时的人 建立一个故事:假设我有关于一个跑步团队成员的不同组合完成一次试

  • 问题内容: 确实对Linq进行SQL分组和求和非常困难,已经在所有地方进行了搜索,但是我不太了解如何将其他解决方案应用于我自己的解决方案。 我的数据库中有一个名为view_ProjectTimeSummary的视图,该视图具有以下字段: 我有一个方法,该方法接受to和from日期参数,并首先创建此List <>: 返回列表(用作datagridview的数据源)之前,我使用相同名称的参数过滤str

  • 问题内容: 我正在使用SQL Server 2012,并且正在尝试执行以下操作: 因此,换句话说,我想从表中选择具有指定的截止日期和日期的随机行,并在里程总和等于或大于该数字时停止:3250 问题答案: 由于您使用的是SQL Server 2012,因此这是一种无需循环的简单方法。 SQLfiddle演示-多次单击“运行SQL”以查看随机结果。

  • UCAEXC::4.0.3用户缺乏权限或找不到对象[我的表的名称] 我想从我在另一个表上执行开始,其他一切都工作得很好... 我在使用: UCANAccess 4.0.3 MS Access 2007 JDK:java 1.8.0_151 NetBeans:NetBeans IDE 8.2 更新 当用console.bat打开数据库时(顺便说一下,这个文件位于UcanAccess下载文件夹中),我