在sql select中添加增量

时间:2014-10-01 08:56:26

标签: sql oracle

我有一个表格,其中客户交易以这种格式存储:

Account  Tran_type  Tran_Amount  tran_particular Tran_date
165266      C        5000        deposit          19_SEP-2014
165266      D        3000        withdrawal       20-SEP-2014
165266      C        8000        Deposit          21-SEP-2014

我正在尝试为这样的语句提取信息:

select tran_date, tran_particular,
(case when tran_type = 'C' then tran_amt else 0 end) CREDIT,
(case when tran_type = 'D' then tran_amt else 0 end) DEBIT 
from tran_table order bby tran_date asc;

是否有扫描仪在每行上添加余额列,以便在交易后显示余额?说:

 DATE       DESC        CREDIT DEBIT  BALANCE
19-SEP-2014 DEPOSIT     5000   0      5000
20-SEP-2014 WITHDRAWAL         3000   2000
21-SEP-2014 DEPOSIT     8000   0      10000 

请协助。

编辑 我已根据建议进行了调查,但似乎我的余额已标记为日期。查看我目前的输出:

enter image description here

请参阅天数在日期更改之前不会更改。

3 个答案:

答案 0 :(得分:1)

select tran_date, tran_particular, Credit, Debit, 
       SUM(Delta) OVER (ORDER BY tran_date) AS Balance
from
(
  select tran_date, tran_particular, 
  Case Tran_Type
    When 'C' THEN Tran_Amount
    Else 0
  End AS Credit,
  Case Tran_Type
    When 'D' THEN Tran_Amount
    Else 0
  End AS Debit,
  Case Tran_Type
    When 'C' THEN Tran_Amount
    When 'D' THEN -1 * Tran_Amount
    Else 0
  End AS Delta
  from TRANSACTIONS
  order by tran_date
)

应该这样做

答案 1 :(得分:0)

这将花费一个子查询:

SELECT tran_date, tran_particular,
(CASE when tran_type = 'C' THEN tran_amt ELSE 0 end) CREDIT,
(CASE when tran_type = 'D' THEN tran_amt ELSE 0 end) DEBIT,
(SELECT 
  SUM(CASE when type = 'C' tran_amt ELSE (-1) * tran_amt end)  
  FROM tran_table trn2
  WHERE
  trn2.Account   = trn1.Account  
  AND trn2.tran_id <= trn1.tran_id
  -- AND trn2.tran_date <= trn1.tran_date 
)
BALANCE 
FROM 
tran_table trn1 ORDER BY tran_date asc;

在大型数据中,不建议使用这样的子查询。
具有物化视图更合理。

答案 2 :(得分:0)

Select  *,Sum( case when type ='C'
    then amount 
    else -amount 
    end ) over (ORDER BY date ROWS 
    BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW  )'Balance' 
from #tt1