web-dev-qa-db-ja.com

ページネーションを使用して以前のレコードから計算するデビットクレジットバランス

次のデータを含むテーブルがあります。

ID      In       Out 
1      100.00    0.00   
2       10.00    0.00   
3        0.00   70.00    
4        5.00    0.00    
5        0.00   60.00   
6       20.00    0.00     

今、私は私に次の結果を与えるクエリが必要です:

ID      In       Out    Balance
1      100.00    0.00   100.00
2       10.00    0.00   110.00
3        0.00   70.00    40.00
4        5.00    0.00    45.00
5        0.00   60.00   -15.00
6       20.00    0.00     5.00

トリガーまたは一時変数またはstoredを使用せずに、1つのクエリでこれを行うことは可能ですか?手順?また、テーブル/グリッドのページネーションで動作します。

私はこの質問を this から作成しました。これに対する答えはまだありません。

quickソリューションについては、この仲間を試すことができます:

-- Run this at first to set starting value at zero 
SET @variable = 0;
-- Without Pagination
SELECT        ID, `In`, `Out`, @variable := @variable + (`In` - `Out`) `Balance`
FROM          <your_table>
ORDER BY      ID ASC;
-- With Pagination
SELECT        ID, `In`, `Out`, @variable := @variable + (`In` - `Out`) `Balance`
FROM          <your_table>
ORDER BY      ID ASC
LIMIT         0 /* INDEX FOR THE START */, 5 /* NUMBER OF DISPLAYED ITEMS */;

結果の例:

enter image description here

これがhelp/guide問題解決に向けて、乾杯!

2
Avidos

Postgresでタグ付けしたので:

_select id, 
       "in", 
       "out", 
       sum("in") over (order by id) - sum("out") over (order by id) as balance
from data
order by id;
_

上記はPostgres固有ではなく、ウィンドウ関数を使用した標準のANSI SQLです。

オンラインの例: http://rextester.com/ENBLS73027

ページネーションを追加するには、row_number()を使用します

_select id, "in", "out", balance
from (
  select id, 
         "in", 
         "out", 
         sum("in") over (order by id) - sum("out") over (order by id) as balance, 
         row_Number() over (order by id) as rn
  from data
) t
where rn between 3 and 6 -- rows 3,4,5 and 6
order by id;
_