在一个 SQL 查询中获取数据
Get Data in one SQL query
我的目标很简单,但我不知道是否可以在一个 SQL 查询中检索我的数据。
我有一个包含 4 列的 table,第一列包含一些要支付的金额,最后是分期付款的 ID。我想要,对于给定的金额,获得我可以支付的所有分期付款。
例如(使用下面的 table)如果我有一个数量 = 2800 我想获得前 3 行 (500/2000/2000) 因为第一个500,第二个2000,第三个300
那么是否可以只在一个查询中获得所需的行?我使用 SQL 服务器。
已编辑:
假设我拥有的金额是 2800
问题,我将用该金额支付哪几期?
响应 : 我会用 ID 136 / 135 和 134 支付 3 期付款。
- 首先我有2800所以我可以支付前500
- 第二个我还剩2300所以我可以付第二个2000
- 第三个我还剩300所以我可以付第三个2000(还有1700还没有付)
谢谢。
你好像想要一个累计和。如果您使用的是 SQL Server 2012+,那么这很简单:
select t.*
from (select t.*, sum(col1) over (order by installmenthiddenid desc) as cumesum
from table t
) t
where cumesum - col1 <= 2800;
我正在猜测列名以及您如何定义排序。
在 SQL 服务器的早期版本中,您可以使用 apply
或相关子查询执行相同的操作。
编辑:
在 SQL Server 2008 中,您可以:
select t.*
from table t cross apply
(select t2.*, sum(t2.col1) as cumesum
from table t2
where t2.installmenthiddenid >= t.installmenthiddenid
) t2
where t2.cumesum - t.col1 <= 2800;
试试这个。使用 Self join
.
计算总计 运行
;WITH cte
AS (SELECT Sum(b.amount) - 2800 AS amnt,
a.installpaidamount,
a.endinstallment,
a.installhiddenid
FROM Yourtable a
JOIN Yourtable b
ON b.endinstallment >= a.endinstallment
GROUP BY a.installpaidamount,
a.endinstallment,
a.installhiddenid),
cte2
AS (SELECT TOP 1 *
FROM cte
WHERE amnt > 0
ORDER BY amnt) SELECT *
FROM cte
WHERE amnt < 0
UNION ALL
SELECT *
FROM cte2
我的目标很简单,但我不知道是否可以在一个 SQL 查询中检索我的数据。
我有一个包含 4 列的 table,第一列包含一些要支付的金额,最后是分期付款的 ID。我想要,对于给定的金额,获得我可以支付的所有分期付款。
例如(使用下面的 table)如果我有一个数量 = 2800 我想获得前 3 行 (500/2000/2000) 因为第一个500,第二个2000,第三个300
那么是否可以只在一个查询中获得所需的行?我使用 SQL 服务器。
已编辑:
假设我拥有的金额是 2800
问题,我将用该金额支付哪几期?
响应 : 我会用 ID 136 / 135 和 134 支付 3 期付款。
- 首先我有2800所以我可以支付前500
- 第二个我还剩2300所以我可以付第二个2000
- 第三个我还剩300所以我可以付第三个2000(还有1700还没有付)
谢谢。
你好像想要一个累计和。如果您使用的是 SQL Server 2012+,那么这很简单:
select t.*
from (select t.*, sum(col1) over (order by installmenthiddenid desc) as cumesum
from table t
) t
where cumesum - col1 <= 2800;
我正在猜测列名以及您如何定义排序。
在 SQL 服务器的早期版本中,您可以使用 apply
或相关子查询执行相同的操作。
编辑:
在 SQL Server 2008 中,您可以:
select t.*
from table t cross apply
(select t2.*, sum(t2.col1) as cumesum
from table t2
where t2.installmenthiddenid >= t.installmenthiddenid
) t2
where t2.cumesum - t.col1 <= 2800;
试试这个。使用 Self join
.
;WITH cte
AS (SELECT Sum(b.amount) - 2800 AS amnt,
a.installpaidamount,
a.endinstallment,
a.installhiddenid
FROM Yourtable a
JOIN Yourtable b
ON b.endinstallment >= a.endinstallment
GROUP BY a.installpaidamount,
a.endinstallment,
a.installhiddenid),
cte2
AS (SELECT TOP 1 *
FROM cte
WHERE amnt > 0
ORDER BY amnt) SELECT *
FROM cte
WHERE amnt < 0
UNION ALL
SELECT *
FROM cte2