2014-02-24 29 views
0

我試圖在列上應用運行公式這樣。我試了很多我仍然無法做到這一點。任何一個給出的想法,使用oracle sql,oracle sql在查詢中使用上面的單元格計算值

EMP NO SAL DEDUCTION BALANCE 
1  10 5   10-5=5 
1  10 2   5-2=3 
1  15 2   3-2=1 
1  21 1   1-1=0 

我使用了滯後函數,但它返回了上述單元格的相同值。

+1

開始

如果我理解正確的話你的需要,試試這個實際上明白你在問什麼。因爲它完全不可理解。 – jwenting

+0

plz任何一個給出的答案 – user3209083

+3

這裏需要一些更多的信息:看起來像你開始與薩爾和減去DEDUCTION每一行。但是你會忽略連續行上的EMP NO和SAL? – Richard

回答

0

你需要一個排序字段來正確地獲得差異。

我引入了一個遞增的字段來模擬一些排序。 我認爲不同的員工沒有不同的扣減。否則,您可以通過EMP_NO進行分區。通過EMP_NO(你想要什麼,如果這是)

CREATE TABLE T 
(SORT_KEY NUMBER, 
EMP_NO  NUMBER, 
SAL  NUMBER, 
DEDUCTION NUMBER); 

INSERT INTO T VALUES(1, 1, 10, 5); 
INSERT INTO T VALUES(2, 1, 10, 2); 
INSERT INTO T VALUES(3, 1, 15, 2); 
INSERT INTO T VALUES(4, 1, 21, 1); 

COMMIT; 

SELECT SORT_KEY, SAL, 
     ABS(V) AS DEDUCTION, 
     SUM(V) OVER(ORDER BY SORT_KEY) AS BALANCE 
FROM (SELECT SORT_KEY, SAL, 
      CASE WHEN LAG(DEDUCTION, 1) OVER(ORDER BY SORT_KEY) IS NULL 
        THEN SAL - DEDUCTION 
        ELSE - DEDUCTION END AS V 
     FROM t 
     ORDER BY SORT_KEY) 
ORDER BY SORT_KEY; 

SORT_KEY SAL DEDUCTION BALANCE 
-------- -- --------- ------- 
     1 10 5   5 
     2 10 2   3 
     3 15 2   1 
     4 21 1   0 

DROP TABLE T PURGE; 

分區:通過措辭你的問題在適當的英語,所以人們可能

INSERT INTO T VALUES(5, 2, 10, 5); 
INSERT INTO T VALUES(6, 2, 10, 2); 
INSERT INTO T VALUES(7, 2, 15, 2); 
INSERT INTO T VALUES(8, 2, 21, 1); 

COMMIT; 

SELECT SORT_KEY, EMP_NO, SAL, 
     ABS(V) AS DEDUCTION, 
     SUM(V) OVER(PARTITION BY EMP_NO ORDER BY SORT_KEY) AS BALANCE 
FROM (SELECT SORT_KEY, EMP_NO, SAL, 
      CASE WHEN LAG(DEDUCTION, 1) OVER(PARTITION BY EMP_NO ORDER BY SORT_KEY) IS NULL 
        THEN SAL - DEDUCTION 
        ELSE - DEDUCTION END AS V 
     FROM t 
     ORDER BY SORT_KEY) 
ORDER BY EMP_NO, SORT_KEY; 
0

雖然業務需求仍然是一個謎給我,這裏是做到這一點的一種方式(我已經添加了RN專欄介紹的行排序):

with employees as (
    select 1 as rn, 1 as emp_no,10 as sal,5 as deduction, '10-5=5' as balance from dual union all 
    select 2 as rn, 1 as emp_no,10 as sal,2 as deduction, '5-2=3' as balance from dual union all 
    select 3 as rn, 1 as emp_no,15 as sal,2 as deduction, '3-2=1' as balance from dual union all 
    select 4 as rn, 1 as emp_no,21 as sal,1 as deduction, '1-1=0' as balance from dual) 
select v1.*, 
    v1.sal - v1.aggr_deduction as remaining_sal_current_sal, 
    v1.first_sal - v1.aggr_deduction as remaining_sal_first_sal 
from (
select rn, 
     emp_no, 
     sal, 
     deduction, 
     balance, 
     sum(deduction) over (partition by emp_no order by rn) as aggr_deduction, 
     (select sal from employees e1 where rn = 1) as first_sal 
from employees 
) v1 
order by rn 

SQL Fiddle