오라클 경우의수 질문 드립니다.. 0 2 1,502

by 가가멜 [SQL Query] 오라클 경우의 수 [2014.07.09 13:17:46]


오라클 경우의 수 구하는 쿼리 질문드립니다.

예를들어
 
제품이라는 테이블이 있는데 이 테이블에는 제품명, 제품가격 등의 제품에 대한 정보들을 담고 있습니다.
 
무작위로 장바구니에 위 테이블에 저장된 제품을  1개 이상 담을 수 있는데
 
장바구니에 담은 위의 제품들의 가격의 합이 5000원 미만이 되는 모든 경우의 수를 구하고 싶은데
 
고수분들 답변 부탁드립니다.
by 마농 [2014.07.09 15:59:54]
WITH t AS
(
SELECT 'A' cod, 5000 amt FROM dual
UNION ALL SELECT 'B', 4000 FROM dual
UNION ALL SELECT 'C', 4000 FROM dual
UNION ALL SELECT 'D', 3000 FROM dual
UNION ALL SELECT 'E', 3000 FROM dual
UNION ALL SELECT 'F', 3000 FROM dual
UNION ALL SELECT 'G', 2000 FROM dual
UNION ALL SELECT 'H', 2000 FROM dual
UNION ALL SELECT 'I', 2000 FROM dual
UNION ALL SELECT 'J', 2000 FROM dual
UNION ALL SELECT 'K', 1000 FROM dual
UNION ALL SELECT 'L', 1000 FROM dual
UNION ALL SELECT 'M', 1000 FROM dual
UNION ALL SELECT 'N', 1000 FROM dual
UNION ALL SELECT 'O', 1000 FROM dual
UNION ALL SELECT 'P',  500 FROM dual
UNION ALL SELECT 'Q',  500 FROM dual
)
, t1(cod, amt, cnt, cods, amts, tot) AS
(
SELECT cod
     , amt
     , 1 cnt
     , CAST(cod AS VARCHAR2(4000)) cods
     , CAST(amt AS VARCHAR2(4000)) amts
     , amt tot
  FROM t
 WHERE amt < 5000
 UNION ALL
SELECT c.cod
     , c.amt
     , DECODE(p.cod, c.cod, p.cnt+1, 1) cnt
     , DECODE(p.cod, c.cod, REGEXP_REPLACE(p.cods, '[*][0-9]+$')||'*'||(p.cnt+1), p.cods||'+'||c.cod) cods
     , DECODE(p.cod, c.cod, REGEXP_REPLACE(p.amts, '[*][0-9]+$')||'*'||(p.cnt+1), p.amts||'+'||c.amt) amts
     , p.tot + c.amt tot
  FROM t c
     , t1 p
 WHERE p.tot + c.amt < 5000
   AND p.cod <= c.cod
)
SELECT cods
     , amts
     , tot
  FROM t1
;

 


by 약쟁이총각 [2014.07.09 16:36:08]

두시간 보다가 포기했었는데..

경우의 수는 대충나오는데.. 5000미만을 돌출하는데 쉽지 않네요.. ㅜㅜ

쿼리 참고 하겠습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입