在一个SQL查询中获取数据

时间:2015-01-13 17:14:18

标签: sql sql-server sql-server-2008

我的目标很简单,但我不知道我是否可以在一个SQL查询中检索我的数据。

我有一个包含4列的表,第一列包含一些支付金额,最后一个是分期付款的ID。我希望,对于给定的金额,我可以支付所有分期付款。

例如(使用下表)如果我有一个数量= 2800 我想得到3个第一行(500/2000/2000),因为我会为第一行支付500,2000对于第二个,300为第三个。

enter image description here

那么只能在一个查询中获得所需的行吗?我使用SQL Server。

已编辑:

让我们说我的金额 2800

问题,我将用这笔款项支付哪些分期付款?

回复:我会分三期支付身份证号码136/135和134.

  1. 首先我有2800所以我可以支付前500
  2. 秒我剩下2300所以我可以支付第二个2000
  3. 第三我剩下300,所以我可以支付第三个2000(还有1700仍未支付)
  4. 感谢。

2 个答案:

答案 0 :(得分:3)

您似乎想要累积总和。如果您使用的是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 Server中,您可以使用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;

答案 1 :(得分:1)

试试这个。使用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