轉自:https://www.cnblogs.com/sooner/p/8043013.html
在oracle開發過程中經常會遇到累加、減、乘、除的問題。下面對這個做個小的總結
---創建測試表
CREATE TABLE TEST( PARENT_ID NUMBER, PART_ID NUMBER, QUALITY NUMBER); INSERT INTO TEST VALUES(1,1,2); INSERT INTO TEST VALUES(1,2,3); INSERT INTO TEST VALUES(1,3,2); INSERT INTO TEST VALUES(1,4,5); INSERT INTO TEST VALUES(2,2,3); INSERT INTO TEST VALUES(2,3,5); INSERT INTO TEST VALUES(2,4,7);
一、實現累加
SELECT T.*, SUM(T.QUALITY) OVER (PARTITION BY T.PARENT_ID ORDER BY T.PART_ID) RUNNING_QUALITY FROM TEST T
二、實現累減
SELECT T.PARENT_ID, T.PART_ID, T.QUALITY, SUM(DECODE(T.RN,1,T.QUALITY,-T.QUALITY)) OVER(PARTITION BY T.PARENT_ID ORDER BY T.PART_ID) RUNNING_PROD FROM ( SELECT T.*, ROW_NUMBER() OVER(PARTITION BY T.PARENT_ID ORDER BY T.PART_ID) RN FROM TEST T) T
三、實現累乘
SELECT T.*, ROUND(EXP(SUM(LN(T.QUALITY)) OVER(PARTITION BY T.PARENT_ID ORDER BY T.PART_ID)),0) RUNNING_PROD FROM TEST T
四、實現累除
SELECT T.PARENT_ID, T.PART_ID, T.QUALITY, EXP(SUM(DECODE(RN,1,LN(T.QUALITY),-LN(T.QUALITY))) OVER(PARTITION BY T.PARENT_ID ORDER BY T.PART_ID)) RUNNING_PROD FROM ( SELECT T.*, ROW_NUMBER() OVER(PARTITION BY T.PARENT_ID ORDER BY T.PART_ID) RN FROM TEST T)T
累乘和累除的缺陷是不能對負數進行運算 因為ln(負數)沒有意義