안녕하세요!
경우의 수를 구하려고 보니 식은 알겠는데 쿼리로 작성하려고 보니 어려움이 있네요..
인터넷에 유사한 결과값이 있는데.. 이게 오라클이라..
기본 데이터는 다음과 같습니다.
DECLARE @TB_LIST TABLE
(
ROWNUM INT
, QTY INT
)
INSERT INTO @TB_LIST VALUES (1, 20)
INSERT INTO @TB_LIST VALUES (2, 30)
INSERT INTO @TB_LIST VALUES (3, 40)
SELECT * FROM @TB_LIST
상기 데이터가 존재할 때 산출하고자 하는 결과값은 다음과 같습니다.
첫번째로 순서까지 고려한 경우의 수
1
2
3
1, 2
1, 3
2, 1
2, 3
3, 1
3, 2
1, 2, 3
1, 3, 2
2, 1, 3
2, 3, 1
3, 1, 2
3, 2, 1
두번째로 순서와 무관한 경우의 수
1
2
3
1, 2
1, 3
2, 3
1, 2, 3
인터넷에서 찾은 오라클 답안
순서까지 고려한 경우의 수
SELECT SUBSTR(SYS_CONNECT_BY_PATH(code,'-'),2) code
FROM test
CONNECT BY NOCYCLE PRIOR code != code
ORDER BY LEVEL, code
순서와 무관한 경우의 수
SELECT SUBSTR(SYS_CONNECT_BY_PATH(code,'-'),2) code
FROM test
CONNECT BY PRIOR code < code
ORDER BY LEVEL, code
추후 산출된 경우의 수 데이터를 Record 데이터와 join 하여 경우의 수 데이터 조합을 산출하려 합니다.
고수님들의 조언 여쭙니다.
감사합니다.
Comment 5
-
건우아빠
2016.09.13 17:16
간단하게DECLARE @TB_LIST TABLE(ROWNUM INT, QTY INT)INSERT INTO @TB_LIST VALUES (1, 20)INSERT INTO @TB_LIST VALUES (2, 30)INSERT INTO @TB_LIST VALUES (3, 40)SELECT a.ROWNUM [a], null [b], null [c]FROM @TB_LIST aunion allSELECT a.ROWNUM , b.ROWNUM , nullFROM @TB_LIST a, @TB_LIST bwhere a.ROWNUM <> b.ROWNUMunion allSELECT a.ROWNUM , b.ROWNUM , c.ROWNUMFROM @TB_LIST a, @TB_LIST b , @TB_LIST cwhere a.ROWNUM <> b.ROWNUMand a.ROWNUM <> c.ROWNUMand b.ROWNUM <> c.ROWNUMorder by 1,2,3SELECT a.ROWNUM [a], null [b], null [c]FROM @TB_LIST aunion allSELECT a.ROWNUM , b.ROWNUM , nullFROM @TB_LIST a , @TB_LIST bwhere b.ROWNUM > a.ROWNUMunion allSELECT a.ROWNUM , b.ROWNUM , c.ROWNUMFROM @TB_LIST a , @TB_LIST b , @TB_LIST cwhere b.ROWNUM > a.ROWNUMand c.ROWNUM > b.ROWNUMorder by 1,2,3오라클 함수 이용..http://www.gurubee.net/lecture/2196 -
독도삼겹살
2016.09.13 17:58
중요한 사항을 말씀안드렸군요..
기본데이터는 샘플로 3개만 넣어본거구요.. 사실 동적이라 보시면 될 것 같습니다.
시스템 효율부분은 일단 무시합니다.
건우아버님께서 답변주신 부분은 동적부분에 있어서 문제가 되겠네요..
그래도 성의있는 답변에 감사드립니다.
제가 적은 오라클 부분도 답글에 작성해주신 URL과 동일합니다.
-
minsouk
2016.09.14 09:05
2016 r 에서는 걍 답이 바로 나와요 ㅎㅎㅎ -
건우아빠
2016.09.18 18:08
오라클용인줄 알았네요...
서핑한 결과 ,,
https://social.msdn.microsoft.com/Forums/sqlserver/en-US/138fc2df-ff40-42a5-adc1-1b3f728737c2/sql-query-permutations-without-repetition?forum=transactsql
DECLARE @TB_LIST TABLE
(
ROWNUM varchar
, QTY INT
)
INSERT INTO @TB_LIST VALUES (1, 20)
INSERT INTO @TB_LIST VALUES (2, 30)
INSERT INTO @TB_LIST VALUES (3, 40)
declare @ROWNUM as int
;
set @ROWNUM = (select count(*) from @TB_LIST);
;
with T (ROWNUM, level) as (
select convert(varchar, ROWNUM), level=1 from @TB_LIST
union all
select convert(varchar,a.ROWNUM+','+T.ROWNUM),level+1
from @TB_LIST a,T
where level < @ROWNUM
and charindex(a.ROWNUM,T.ROWNUM) = 0
)
select ROWNUM
from T
order by level, ROWNUM
;
with T (ROWNUM, level) as (
select convert(varchar, ROWNUM), level=1 from @TB_LIST
union all
select convert(varchar,a.ROWNUM + ','+T.ROWNUM),level+1
from @TB_LIST a,T
where level < @ROWNUM
and charindex(a.ROWNUM,T.ROWNUM) = 0
and t.ROWNUM > a.ROWNUM
)
select ROWNUM
from T
order by level, ROWNUM
-
독도삼겹살
2016.09.20 08:44
역시 명쾌한 답을 주시네요..답변에 감사드립니다.