축구 팀구성 쿼리를 구현중인데
프로시져는 가능하지만 쿼리로 만들어 보려 하는데 막히는게 많네요
제가 원하는 조건은
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 |
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) ;