2015-01-13 3 views
0

Моя цель проста, но я не знаю, могу ли я получить данные в одном запросе SQL.Получить данные в одном SQL-запросе

У меня есть таблица, содержащая 4 столбца, первая содержит некоторые суммы для оплаты, а последний - идентификатор платежа. Я хочу, чтобы за определенную сумму получали все взносы, которые я могу заплатить.

Например, если у меня есть значение = Я хочу получить 3 первых ряда (500/2000/2000), потому что я заплатил бы 500 за первый, 2000 за второй и 300 для третьего.

enter image description here

Так же можно получить нужные строки только в одном запросе? Я использую SQL Server.

Редакция:

скажет Сумму, что у меня есть,

Вопрос, который рассрочкой я буду платить с этой суммой?

ответ: Я хотел бы заплатить 3 платеж с идентификаторами 136/135 и 134.

  1. сначала я 2800, так что я могу оплатить первые 500
  2. секунду я 2300 оставил Так я могу платить вторую 2000
  3. трети меня 300 остались, так что я могу оплатить третьи 2000 (и 1700 по-прежнему остаются неоплаченными)

Спасибо.

+0

уточнения пожалуйста. Расскажите что-нибудь логичное о том, как получить первые три строки на сумму 2800. Я имею в виду, на каком основании? –

+0

так в основном «использовать» любую сумму, которую вы должны погасить с этих балансов? –

+2

Каков порядок оплаты? – frlan

ответ

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 или коррелированным подзапросом.

EDIT:

В 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; 
+0

Я использую SQL SERVER 2008 –

+0

, который работает очень !!! –

1

Попробуйте это. Find Running total using 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 
+0

Благодарим вас за помощь. –

Смежные вопросы