수치 차감해가는 SQL 구현 도와주세여. 0 2 2,308

by 손님 [Oracle 기초] 누적 차감 [2010.05.20 10:57:33]



WITH JO_MAIN AS
(
  SELECT 'A' AS KEY_VALUE, 1000 AS QTY FROM DUAL
UNION SELECT 'B' AS KEY_VALUE, 1000 AS QTY FROM DUAL
UNION SELECT 'C' AS KEY_VALUE, 1000 AS QTY FROM DUAL
)
, JO_DETAIL AS
(
SELECT '20100510' AS DAY_DATE, 500 AS DAY_QTY FROM DUAL UNION
SELECT '20100511' AS DAY_DATE, 600 AS DAY_QTY FROM DUAL UNION
SELECT '20100512' AS DAY_DATE, 700 AS DAY_QTY FROM DUAL UNION
SELECT '20100513' AS DAY_DATE, 300 AS DAY_QTY FROM DUAL UNION
SELECT '20100514' AS DAY_DATE, 500 AS DAY_QTY FROM DUAL
)

두개의 Table이 있는데 서로 연관 관계는 없습니다.

단지 JO_DETAIL의 DAY_QTY 수치가 JO_Main의 QTY 수치가 오버되면 그 수까지의 레코드를 JO_MAIN의 DETAIL로 간주하는것입니다.

KEY_VALUE, QTY, DAY_DATE, DAY_QTY
A    1000 20100510  500
A    1000 20100511  600
B    1000 20100512  700
B    1000 20100513  300
C    1000 20100514  500

위와 같은 형태의 데이터 구조를 가져야 하는데 어찌 해야할지..도움 주시면 감사하겠습니다.
by 서성우 [2010.05.20 12:06:42]
WITH JO_MAIN AS
(
SELECT 'A' AS KEY_VALUE, 1000 AS QTY FROM DUAL
UNION SELECT 'B' AS KEY_VALUE, 1500 AS QTY FROM DUAL
UNION SELECT 'C' AS KEY_VALUE, 2000 AS QTY FROM DUAL
)
, JO_DETAIL AS
(
SELECT '20100510' AS DAY_DATE, 500 AS DAY_QTY FROM DUAL UNION
SELECT '20100511' AS DAY_DATE, 600 AS DAY_QTY FROM DUAL UNION
SELECT '20100512' AS DAY_DATE, 700 AS DAY_QTY FROM DUAL UNION
SELECT '20100513' AS DAY_DATE, 300 AS DAY_QTY FROM DUAL UNION
SELECT '20100514' AS DAY_DATE, 500 AS DAY_QTY FROM DUAL
)
SELECT key_value ,
day_date ,
day_qty
FROM
(SELECT b.key_value ,
a.day_date ,
a.day_qty ,
CASE WHEN Sum(a.day_qty) over (PARTITION BY b.key_value ORDER BY a.day_date) - a.day_qty BETWEEN b.s_qty - b.qty AND s_qty
THEN s_qty END gb,
b.s_qty
FROM JO_DETAIL a, (SELECT key_value ,
qty ,
Sum(qty) over (ORDER BY key_value) s_qty
FROM JO_MAIN) b
)
WHERE gb = s_qty

by 마농 [2010.05.20 13:24:08]
WITH jo_main AS
(
SELECT 'A' key_value, 1000 qty FROM dual
UNION ALL SELECT 'B', 1000 FROM dual
UNION ALL SELECT 'C', 1000 FROM dual
)
, jo_detail AS
(
SELECT '20100510' day_date, 500 day_qty FROM dual
UNION ALL SELECT '20100511', 600 FROM dual
UNION ALL SELECT '20100512', 700 FROM dual
UNION ALL SELECT '20100513', 300 FROM dual
UNION ALL SELECT '20100514', 500 FROM dual
)
SELECT key_value, qty
, day_date, day_qty
FROM (SELECT key_value, qty, SUM(qty) OVER(ORDER BY key_value) s_qty FROM jo_main) a,
(SELECT day_date, day_qty, SUM(day_qty) OVER(ORDER BY day_date) s_day_qty FROM jo_detail) b
WHERE s_day_qty - day_qty >= s_qty - qty
AND s_day_qty - day_qty < s_qty
ORDER BY key_value, day_date
;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입