안녕하세요.
다름이 아니오라 누적 수량을 40개 단위로 자르고 싶습니다.
WITH TT AS (
SELECT '15' OP FROM DUAL
UNION ALL
SELECT '15' OP FROM DUAL
UNION ALL
SELECT '15' OP FROM DUAL
UNION ALL
SELECT '10' OP FROM DUAL
UNION ALL
SELECT '10' OP FROM DUAL
UNION ALL
SELECT '7' OP FROM DUAL
UNION ALL
SELECT '32' OP FROM DUAL
UNION ALL
SELECT '7' OP FROM DUAL
UNION ALL
SELECT '4' OP FROM DUAL
)
SELECT ROW_NUMBER() OVER(ORDER BY TO_NUMBER(OP) DESC) RN, OP
FROM TT;
RN | OP |
1 | 32 |
2 | 15 |
3 | 15 |
4 | 15 |
5 | 10 |
6 | 10 |
7 | 7 |
8 | 7 |
9 | 4 |
위의 데이타와 같이 40개 누적으로 자른다면
BOX1 : 1
BOX2 : 2,3
BOX3 : 4,5,6
BOX4 : 7,8,9
이렇게 총 4박스에 들어가게 되는데
실제 마지막 BOX4 의 수량은 BOX1, BOX2, BOX3 으로 나누어 들어 갈수 있습니다.
이걸 쿼리로 어떻게 구현해야 할지 감이 잘 안오네요.
전문가님들의 의견 부탁 드립니다.
제가 개인적으로은 여기까진 해 봤는데..
마지막 문제가 해결이 안되네요.
WITH T AS (
SELECT SEQ, OP
FROM (
SELECT
ROW_NUMBER() OVER(ORDER BY TO_NUMBER(OP) DESC) SEQ
, OP
FROM (
SELECT '15' OP FROM DUAL
UNION ALL
SELECT '15' OP FROM DUAL
UNION ALL
SELECT '15' OP FROM DUAL
UNION ALL
SELECT '10' OP FROM DUAL
UNION ALL
SELECT '10' OP FROM DUAL
UNION ALL
SELECT '7' OP FROM DUAL
UNION ALL
SELECT '32' OP FROM DUAL
UNION ALL
SELECT '7' OP FROM DUAL
UNION ALL
SELECT '4' OP FROM DUAL
)
)
)
SELECT SEQ, OP, RS2
FROM T
MODEL
DIMENSION BY (SEQ) -- 로우를 식별할 기준이 되는 컬럼 명시
MEASURES(SEQ ASEQ, 0 RSEQ, OP, 0 RS, 0 RS2) -- 새로 계산이 되는 컬럼 명시
IGNORE NAV
RULES AUTOMATIC ORDER
(
RS[SEQ] = CASE WHEN RS[CV()-1]+OP[CV()] > 40 THEN OP[CV()] ELSE TO_CHAR(RS[CV()-1]+OP[CV()]) END
, RSEQ[SEQ] = CASE WHEN RS[CV()-1]+OP[CV()] > 40 THEN ASEQ[CV()] ELSE RSEQ[CV()-1] END
, RS2[SEQ] = CASE WHEN RS[CV()-1]+OP[CV()] > 40 THEN RSEQ[CV()] ELSE RSEQ[CV()-1] END
)
ORDER BY SEQ
;
SEQ | OP | RS2 |
1 | 32 | 0 |
2 | 15 | 2 |
3 | 15 | 2 |
4 | 15 | 4 |
5 | 10 | 4 |
6 | 10 | 4 |
7 | 7 | 7 |
8 | 7 | 7 |
9 | 4 | 7 |
WITH tt AS ( SELECT 15 op FROM dual UNION ALL SELECT 15 FROM dual UNION ALL SELECT 15 FROM dual UNION ALL SELECT 10 FROM dual UNION ALL SELECT 10 FROM dual UNION ALL SELECT 7 FROM dual UNION ALL SELECT 32 FROM dual UNION ALL SELECT 7 FROM dual UNION ALL SELECT 4 FROM dual ) , t0 AS ( SELECT ROW_NUMBER() OVER(ORDER BY op DESC) rn , op FROM tt ) , t1(lv, rn, op, p, r, cnt, box) AS ( SELECT 1 lv , rn , op , '-' || rn || '-' p , '[' || op r , op cnt , 1 box FROM t0 WHERE rn = 1 UNION ALL SELECT p.lv + 1 lv , c.rn , c.op , p.p || c.rn || '-' p , p.r || CASE WHEN p.cnt + c.op > 40 THEN '],[' ELSE ',' END || c.op r , CASE WHEN p.cnt + c.op > 40 THEN c.op ELSE p.cnt + c.op END cnt , CASE WHEN p.cnt + c.op > 40 THEN p.box + 1 ELSE p.box END box FROM t1 p , t0 c WHERE INSTR(p.p, '-'||c.rn||'-') = 0 AND ( p.cnt + c.op > 40 OR p.rn < c.rn ) ) SELECT DISTINCT r FROM (SELECT r||']' r , RANK() OVER(ORDER BY box) rk FROM t1 WHERE lv = 9 ) WHERE rk = 1 ;