已有数据:
==========
会计期 物料分类 期初 本期入 本期出 期末
200901 C1 10 1 2 9
200901 C2 10 1 3 8
200902 C1 9 0 2 7
200902 C2 8 1 2 7
查询 200801-200912 的数据,查询结果:
==========
开始会计期 结束会计期 物料分类 期初 本期入 本期出 期末
200901 200902 C1 10 1 4 7
200901 200902 C2 10 2 5 7
注意:
期初,取查询范围内存在的最小会计期的期初
期末,取查询范围内存在的最大会计期的期末
本期入和出,求和
具体如下:
SQL> select kjq 会计期,
2 wlfl 物料分类,
3 qc 期初,
4 bql 本期入,
5 bqc 本期出,
6 qm 期末
7 from tmp;
会计期 物料分类 期初 本期入 本期出 期末
------ -------- ---------- ---------- ---------- ----------
200901 C1 10 1 2 9
200901 C2 10 1 3 8
200902 C1 9 0 2 7
200902 C2 8 1 2 7
SQL>
SQL> select min(kjq) 开始会计期,
2 max(kjq) 结束会计期,
3 wlfl 物料分类,
4 min(qc) keep(dense_rank first order by kjq) 期初,
5 sum(bql) 本期入,
6 sum(bqc) 本期出,
7 max(qm) keep(dense_rank last order by kjq) 期末
8 from tmp
9 group by wlfl;
开始会计期 结束会计期 物料分类 期初 本期入 本期出 期末
---------- ---------- -------- ---------- ---------- ---------- ----------
200901 200902 C1 10 1 4 7
200901 200902 C2 10 2 5 7
SQL>
WITH TEMP AS
(SELECT T.*,ROW_NUMBER() OVER(PARTITION BY WLFL ORDER BY KJQ) RN1,ROW_NUMBER() OVER(PARTITION BY WLFL ORDER BY KJQ DESC) RN2 FROM
(
SELECT '200901' KJQ,'C1' WLFL,10 QC,1 BQR,2 BQC,9 QM FROM DUAL
UNION
SELECT '200901' KJQ,'C2' WLFL,10 QC,1 BQR,3 BQC,8 QM FROM DUAL
UNION
SELECT '200902' KJQ,'C1' WLFL,9 QC,0 BQR,2 BQC,7 QM FROM DUAL
UNION
SELECT '200902' KJQ,'C2' WLFL,8 QC,1 BQR,2 BQC,7 QM FROM DUAL
) T
)
SELECT MIN(KJQ) 开始会计期,
MAX(KJQ) 结束会计期,
WLFL 物料分类,
(SELECT QC FROM TEMP WHERE WLFL = T.WLFL AND RN1 = 1) 期出,
SUM(BQR) 本期入,
SUM(BQC) 本期出,
(SELECT QM FROM TEMP WHERE WLFL = T.WLFL AND RN2 = 1) 期末
FROM TEMP T GROUP BY WLFL ORDER BY WLFL
开始会计期 结束会计期 物料分类 期初 本期入 本期出 期末
200901 200902 C1 10 1 4 7
200901 200902 C2 10 2 5 7
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21220558/viewspace-590894/ ,如需转载,请注明出处,否则将追究法律责任。