如何在oracle中获取行的总和?

时间:2015-03-18 05:35:22

标签: sql oracle

我写了一个查询,提供以下输出

但我的实际需求是不同的

TRANSACTION_DATE    DETAILS          LEAVE_CREDITED LEAVE_DEBITED
29-Sep-2012      Sep-2012-Sep-2012        0.11  
01-Oct-2012      Oct-2012-Dec-2012        2.5   
01-Jan-2013      Jan-2013-Mar-2013        2.5   
31-Mar-2013      LAPSE - 540007                        1.9
01-Apr-2013      Apr-2013-Jun-2013        2.5   
30-Apr-2013      Lev_102935703                        0.11

应该有第5列

它的值应该是LASTBALANCE +(Leave_Credited) - (Leave_Debited) 在这种情况下

BALANCE
0.11-0=         0.11
0.11+(2.5-0)=   2.61
2.61+(2.5-0)=   5.11
5.11+(0-1.9)=   3.02

请帮忙。

我的查询类似于

SELECT TRUNC(NVL(C.UPDATED_DATE, C.CREATED_DATE)) TRANSACTION_DATE,
       TO_CHAR(C.SERVICE_START_DATE, 'Mon-YYYY') || '-' ||
       TO_CHAR(C.SERVICE_END_DATE, 'Mon-YYYY') Details,
       C.LEAVE_CREDITED,
       NULL LEAVE_DEBITED
  FROM LEAVE.GES_LEV_CREDIT_DETAILS C, LEAVE.GES_LEV_CREDIT_MASTER CM
 WHERE C.LEV_CREDIT_ID = CM.LEV_CREDIT_ID
   AND C.PERSON_ID = 12345
   AND CM.COUNTRY_LEAVE_TYPE_ID = 5225
     AND c.leave_credited<>0
UNION
SELECT TRUNC(NVL(d.UPDATED_DATE, d.CREATED_DATE)) TRANSACTION_DATE,
       d.reference,
       NULL,
       d.no_of_days LEAVE_DEBITED
  FROM LEAVE.GES_LEV_CREDIT_DETAILS C,
       LEAVE.GES_LEV_CREDIT_MASTER  CM,
       leave.ges_lev_debit_req_dtls       D
 WHERE C.LEV_CREDIT_ID = CM.LEV_CREDIT_ID
   AND C.LEV_CREDIT_DETAIL_ID = D.LEV_CREDIT_DETL_ID
   AND C.PERSON_ID = 12345
   AND CM.COUNTRY_LEAVE_TYPE_ID = 5225

2 个答案:

答案 0 :(得分:2)

  

5.11+(0-1.9)= 3.02

不应该是3.21。

对已记入和已扣除的列使用Analytic SUM()OVER(),然后区分它们。

让我们看一个有效的测试案例,我使用 WITH 子句构建了你的表,实际上你只需要使用你的表而不是 DATA

SQL> WITH DATA AS(
  2  SELECT to_date('29-Sep-2012', 'dd-Mon-yyyy') TRANSACTION_DATE, 0.11 LEAVE_CREDITED, NULL LEAVE_DEBITED FROM dual UNION ALL
  3  SELECT to_date('01-Oct-2012', 'dd-Mon-yyyy') TRANSACTION_DATE, 2.5  LEAVE_CREDITED, NULL LEAVE_DEBITED FROM dual UNION ALL
  4  SELECT to_date('01-Jan-2013', 'dd-Mon-yyyy') TRANSACTION_DATE, 2.5  LEAVE_CREDITED, NULL LEAVE_DEBITED FROM dual UNION ALL
  5  SELECT to_date('31-Mar-2013', 'dd-Mon-yyyy') TRANSACTION_DATE, NULL LEAVE_CREDITED, 1.9 LEAVE_DEBITED FROM dual UNION ALL
  6  SELECT to_date('01-Apr-2013', 'dd-Mon-yyyy') TRANSACTION_DATE, 2.5   LEAVE_CREDITED, NULL LEAVE_DEBITED FROM dual UNION ALL
  7  SELECT to_date('30-Apr-2013', 'dd-Mon-yyyy') TRANSACTION_DATE, null LEAVE_CREDITED, 0.11 LEAVE_DEBITED FROM dual
  8  )
  9  SELECT t.*,
 10    SUM(NVL(leave_credited,0)) OVER(ORDER BY TRANSACTION_DATE)
 11     -
 12    SUM(NVL(LEAVE_DEBITED,0)) OVER(ORDER BY TRANSACTION_DATE) LASTBALANCE
 13  FROM DATA t
 14  /

TRANSACTI LEAVE_CREDITED LEAVE_DEBITED LASTBALANCE
--------- -------------- ------------- -----------
29-SEP-12            .11                       .11
01-OCT-12            2.5                      2.61
01-JAN-13            2.5                      5.11
31-MAR-13                          1.9        3.21
01-APR-13            2.5                      5.71
30-APR-13                          .11         5.6

6 rows selected.

SQL>

您的查询如下:

SELECT t.*,
  SUM(NVL(leave_credited,0)) OVER(ORDER BY TRANSACTION_DATE) 
   - 
  SUM(NVL(LEAVE_DEBITED,0)) OVER(ORDER BY TRANSACTION_DATE) LASTBALANCE
FROM table_name t                                                  
/

答案 1 :(得分:0)

我正在使用Oracle。

  

您可以使用sum()over(按transaction_date排序)来运行   总计 - 将处理已失去的叶子等 - &gt;

输出:

enter image description here

脚本:

select to_date(transaction_date) transaction_date, details, 
leave_credited, leave_debited, 
sum(leave_credited - leave_debited) over (order by to_date(transaction_date) asc) final_balance
from
  (select '29-Sep-2012' transaction_date,
    'Sep-2012-Sep-2012' details,
    0.11 leave_credited,
    0 leave_debited
  from dual
  union all
  select '01-Oct-2012' , 'Oct-2012-Dec-2012' , 2.5 , 0 from dual
  union all
  select '01-Jan-2013' , 'Jan-2013-Mar-2013' , 2.5 , 0 from dual
  union all
  select '31-Mar-2013' , 'LAPSE - 540007' , 0, 1.9 from dual
  union all
  select '01-apr-2013' , 'apr-2013-jun-2013' , 2.5, 0 from dual
  union all
  select '30-Apr-2013' , 'Lev_102935703' , 0, 0.11 from dual
  );