|
确实是很老的贴了,如果是现在用11GR2:
create table test (grp_id number,qty number);
INSERT INTO test VALUES (1,2);
INSERT INTO test VALUES (1,3);
INSERT INTO test VALUES (1,4);
INSERT INTO test VALUES (1,6);
INSERT INTO test VALUES (2,1);
INSERT INTO test VALUES (2,7);
INSERT INTO test VALUES (3,6);
INSERT INTO test VALUES (3,8);
INSERT INTO test VALUES (3,5);
INSERT INTO test VALUES (4,NULL);
INSERT INTO test VALUES (4,2);
INSERT INTO test VALUES (4,3);
INSERT INTO test VALUES (4,NULL);
WITH data AS (
SELECT test.*
,ROW_NUMBER() OVER(PARTITION BY grp_id ORDER BY grp_id) rn
,COUNT(*) OVER(PARTITION BY grp_id) cnt
FROM test
)
,t(grp_id,qty,prod,rn,cnt) AS (
SELECT grp_id,qty,qty,rn,cnt FROM data WHERE rn=1
UNION ALL
SELECT t.grp_id,d.qty
,NVL2(t.prod,NVL2(d.qty,d.qty*t.prod,t.prod),d.qty) prod
,d.rn,d.cnt
FROM data d,t
WHERE d.grp_id = t.grp_id
AND t.rn+1=d.rn
AND t.rn<t.cnt
)
SELECT grp_id,prod FROM t WHERE rn=cnt;
GRP_ID PROD
---------- ----------
2 7
3 240
1 144
4 6 |
|