在oracle開發過程當中常常會遇到累加、減、乘、除的問題。下面對這個作個小的總結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);
1、實現累加spa
SELECT T.*, SUM(T.QUALITY) OVER (PARTITION BY T.PARENT_ID ORDER BY T.PART_ID) RUNNING_QUALITY FROM TEST T
2、實現累減code
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
3、實現累乘blog
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
4、實現累除開發
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(負數)沒有意義class