자동 팀구성 쿼리좀 문의드립니다. 1 6 184

by 수예라임 [SQL Query] [2019.09.11 10:37:47]


축구 팀구성 쿼리를 구현중인데

프로시져는 가능하지만 쿼리로 만들어 보려 하는데 막히는게 많네요

제가 원하는 조건은

1.파라미터로 팀나누기 (2팀~4팀) 

2.미들,수비,공격순으로 루프를 돌면서 팀원을 착출 하려고 합니다.
   EX) 2팀일 경우 미들 : 사커1,사커2
                       수비 : 사커3,사커5
                       공격 : 사커3,사커6
                       미들 : 사커7,사커8....... 반복

랭크 함수를 써서 하면 될것 같은데 
생각보다 잘 안되서 도움을 요청해봅니다~

이름 미들 수비 공격
사커1 84.75 73.25 79.85
사커2 82.25 80.55 84.65
사커3 81.75 81.85 85.45
사커4 80.5 75.2 74
사커5 78.8 79.54 75.61
사커6 76 78.1 72.5
사커7 73.25 69.2 57.3
사커8 73.25 69.9 67.95
사커9 71.75 70.95 68.25
사커10 70.35 67.44 64.05
사커11 68.75 71.25 70.05
사커12 68.7 70.83 66.74
사커13 67.6 66.26 65.5
사커14 66.75 63.65 63.1
사커15 66.55 67.93 67.35
사커16 65.65 70.54 65.6
사커17 64.75 60.2 57.7
사커18 63.85 60.66 62.6

 

by 마농 [2019.09.11 10:56:07]

원본 대비 결과표를 좀더 정확하게 표현해 주세요.


by 수예라임 [2019.09.11 12:33:48]

 

결과표입니다.

팀선정시 순서는 미들,수비,공격중 상위 2명씩 입니다. (팀을 파라메타로 3개로 나눌경우 상위3명씩)

포지션 팀1 팀2 비고
미들1 사커1 사커2 미들 상위 2명
수비1 사커3 사커5 위에 선정한 미들 제외 후 수비 상위2명
공격1 사커4 사커6 미들 + 수비 제외후 공격 상위 2명
미들2 사커8 사커7 반복
수비2 사커11 사커2 ..
공격2 사커15 사커12 ..
미들3 사커10 사커13 ..
수비3 사커16 사커14  
공격3 사커18 사커17  

by jkson [2019.09.11 16:06:19]

딥따 어려운 문제로군요.

절차적으로 처리해야하는 부분인데 재귀쿼리로 가능할지..


by jkson [2019.09.11 11:35:19]

능력치로만 줄을 세우면 사커2는 미들, 수비, 공격 모두 ranking안에 들어서 많이 바쁘겠네요ㅎㅎ


by 마농 [2019.09.16 16:54:05]
WITH t AS
(
SELECT '사커01' 이름, 84.75 미들, 73.25 수비, 79.85 공격 FROM dual
UNION ALL SELECT '사커02', 82.25, 80.55, 84.65 FROM dual
UNION ALL SELECT '사커03', 81.75, 81.85, 85.45 FROM dual
UNION ALL SELECT '사커04', 80.50, 75.20, 74.00 FROM dual
UNION ALL SELECT '사커05', 78.80, 79.54, 75.61 FROM dual
UNION ALL SELECT '사커06', 76.00, 78.10, 72.50 FROM dual
UNION ALL SELECT '사커07', 73.25, 69.20, 57.30 FROM dual
UNION ALL SELECT '사커08', 73.25, 69.90, 67.95 FROM dual
UNION ALL SELECT '사커09', 71.75, 70.95, 68.25 FROM dual
UNION ALL SELECT '사커10', 70.35, 67.44, 64.05 FROM dual
UNION ALL SELECT '사커11', 68.75, 71.25, 70.05 FROM dual
UNION ALL SELECT '사커12', 68.70, 70.83, 66.74 FROM dual
UNION ALL SELECT '사커13', 67.60, 66.26, 65.50 FROM dual
UNION ALL SELECT '사커14', 66.75, 63.65, 63.10 FROM dual
UNION ALL SELECT '사커15', 66.55, 67.93, 67.35 FROM dual
UNION ALL SELECT '사커16', 65.65, 70.54, 65.60 FROM dual
UNION ALL SELECT '사커17', 64.75, 60.20, 57.70 FROM dual
UNION ALL SELECT '사커18', 63.85, 60.66, 62.60 FROM dual
)
, t1 AS
(
SELECT *
  FROM t
 UNPIVOT (v FOR gb IN (미들, 수비, 공격))
)
, t2(n, lv, rn, gb, x, 이름) AS
(
SELECT 3 n    -- 팀 수 지정(2~4)
     , 1 lv
     , 1 rn
     , '미들' gb
     , CAST('' AS VARCHAR2(999)) x
     , (SELECT MIN(이름) KEEP(DENSE_RANK FIRST ORDER BY v DESC, 이름) FROM t1 WHERE gb = '미들') 이름
  FROM dual
 UNION ALL
SELECT n
     , lv + 1 lv
     , DECODE(rn, n, 1, rn + 1) rn
     , DECODE(rn, n, DECODE(gb, '미들', '수비', '수비', '공격', '공격', '미들'), gb) gb
     , x ||','|| 이름 x
     , (SELECT MIN(이름) KEEP(DENSE_RANK FIRST ORDER BY v DESC, 이름)
          FROM t1
         WHERE gb = DECODE(a.rn, a.n, DECODE(a.gb, '미들', '수비', '수비', '공격', '공격', '미들'), a.gb)
           AND INSTR(','||a.x||','||a.이름||',', ','||이름||',') = 0
        ) 이름
  FROM t2 a
 WHERE lv < (SELECT COUNT(*) FROM t)
)
SELECT gb || CEIL(CEIL(lv / n) / 3) gb
     , MIN(DECODE(rn, 1, 이름)) 이름1
     , MIN(DECODE(rn, 2, 이름)) 이름2
     , MIN(DECODE(rn, 3, 이름)) 이름3
     , MIN(DECODE(rn, 4, 이름)) 이름4
  FROM t2
 GROUP BY CEIL(lv / n), gb
 ORDER BY CEIL(lv / n)
;

 


by jkson [2019.09.17 11:13:14]

오 깔끔하네요.

재귀 쿼리에다가 서브쿼리로 구현하면 되었네요.

재귀 쿼리에 조인으로 하려고 하니까

잘 안 되더라고요.

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