在一个 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 期付款。

  1. 首先我有2800所以我可以支付前500
  2. 第二个我还剩2300所以我可以付第二个2000
  3. 第三个我还剩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