WITH T(FRM, ORD, SCR) AS ( SELECT 1 , 1, '9' FROM DUAL UNION ALL SELECT 1 , 2, '/' FROM DUAL UNION ALL SELECT 2 , 1, '8' FROM DUAL UNION ALL SELECT 2 , 2, '0' FROM DUAL UNION ALL SELECT 3 , 1, 'X' FROM DUAL UNION ALL SELECT 3 , 2, '' FROM DUAL UNION ALL SELECT 4 , 1, 'X' FROM DUAL UNION ALL SELECT 4 , 2, '' FROM DUAL UNION ALL SELECT 5 , 1, '8' FROM DUAL UNION ALL SELECT 5 , 2, '0' FROM DUAL UNION ALL SELECT 6 , 1, 'X' FROM DUAL UNION ALL SELECT 6 , 2, '' FROM DUAL UNION ALL SELECT 7 , 1, '8' FROM DUAL UNION ALL SELECT 7 , 2, '1' FROM DUAL UNION ALL SELECT 8 , 1, '9' FROM DUAL UNION ALL SELECT 8 , 2, '/' FROM DUAL UNION ALL SELECT 9 , 1, '8' FROM DUAL UNION ALL SELECT 9 , 2, '1' FROM DUAL UNION ALL SELECT 10, 1, 'X' FROM DUAL UNION ALL SELECT 10, 2, '9' FROM DUAL UNION ALL SELECT 10, 3, '/' FROM DUAL)
그럼 프레임당 2번 던지는데,
질문1.
스페어 처리시 다음공 점수 포함이
다음 프레임의 첫번째 투구 점수를 의미하나요?
그렇다면 스트라이크는 다음 프레임 점수를 다 더하는게 맞나요?
질문2.
10번째 프레임은 3번 던지는데
9번째 프레임에서 스페어 처리면 10번째 3개 투구中 1번째 투구만 점수를 더하고
9번째 프레임에서 스트라이크 처리면 10번째 3번째 투구 점수를 제외 1, 2번째 투구 점수를 더하는게 맞나요?
질문3.
10번째 프레임에서는
1번을 투구하든, 2번을 투구하든, 3번을 투구하든 그냥 다 더하나요?
또한, 10번째 프레임에서는 스페어 처리든, 스트라이크 처리든 다음 프레임이 없기 때문에
가산 점수가 없나요?
@.@)/ 빙긍빙글빙글...
10프레임만 가산 없이 점수 환산하면
20점인가요? (X + (9 + /) = 10 + 10
그럼 아무 가산 없이
1프레임부터 10프레임까지 순수 점수는 104점.
(10 + 8 + 10 + 10 + 8 + 10 + 9 + 10 + 9 + 20)
스페이 처리로 인한 가산 총점
(스페이 처리 총 3개이나 마지막 스페이 처리 제외)
2개 16점(8 + 8)
스트라이크 처리로 인한 가산점
스트라이크 처리 총 4개 36점(10 + 8 + 9 + 9)
총점 104 + 16 + 36 = 156점
만약 10프레임 순수 점수를 20점이 아닌 10 + 9 + 10으로 29점으로 보면
총점 113 + 16 + 36 = 165점
디케이님이 올려주신 예상 총점으로 올린 165점이 맞다면
10프레임 총합이 29점이라는 것인데,
3번 투구 했지만, 마지막은 스페어 처리해서 1개 잡은 것이라면 20점이라 총점이 156점이고.
10프레임 2번째 투구시 1개 남기고 9개 잡아도, 3번째 투구시 리셋해서 다시 10개 놓고 맞춰서
다 맞췄다는 것인가요? 그럼 스페어 처리 표시가 아닌 스트라이크 표시 아닌가요?
이 부분만 풀리면 일단 계산법은 마스터 하겠네요.. ㅋㅅㅋ)/
SELECT frm , SUBSTR(XMLAgg(XMLElement(x, '|', scr) ORDER BY ord).Extract('//text()'), 2) s , SUM(SUM(v)) OVER(ORDER BY frm) v FROM (SELECT frm, ord, scr , SUM(x) OVER(ORDER BY frm, ord ROWS BETWEEN CURRENT ROW AND y FOLLOWING) v FROM (SELECT frm, ord, scr , DECODE(scr , 'X', 10 , '/', 10 - LAG(scr) OVER(ORDER BY frm, ord) , scr) x , DECODE(frm, 10, 0, DECODE(scr, 'X', 2, '/', 1, 0)) y FROM t WHERE scr IS NOT NULL ) ) GROUP BY frm ;
-- 부끄럽지만 제가 만든것도 올려봅니다. -- 만들면서 경우의 수가 계속 나와서 DECODE, CASE 문장을 많이 사용했어요.. SELECT frm, ord, scr, score, next_link, SUM(c_score) OVER (ORDER BY frm, ord) sum_score FROM ( SELECT frm, ord, scr, score, next_link,SUM(score) OVER (ORDER BY frm, ord ROWS BETWEEN CURRENT ROW AND next_link FOLLOWING ) c_score FROM ( SELECT frm, ord, scr, score, DECODE(frm, 10, 0, DECODE(scr, 'X', 2, '/', 1, 0)) next_link FROM (SELECT frm, ord, scr, TO_NUMBER(DECODE(scr, 'X', '10', '/', 10-MAX(DECODE(scr, 'X', '10', scr)) OVER (PARTITION BY frm), scr)) score FROM t WHERE ord IN (1, 2) AND scr IS NOT NULL UNION ALL SELECT frm, 3 ord, scr , TO_NUMBER( CASE scr WHEN 'X' THEN 10 WHEN '/' THEN 10 -(SELECT decode(scr, 'X', 0, '/', 0, scr) FROM t WHERE frm = 10 AND ord =2) ELSE to_number(scr) END) score FROM t WHERE frm = 10 AND ord = 3 ) ) )
제가 낸 문제군요? ^^
시간이 없어서 못 풀고 있었는데, 시간나면 풀어봐야겠네요.
수고들 하셨습니다.
LAG, LEAD 배워 갑니다 ㅎㅎ
SELECT FRM, ORD, SCR, SCR2, SUM(얻은점수) OVER(ORDER BY FRM, ORD) AS TOTAL FROM (SELECT FRM, ORD, SCR, SCR2, CASE WHEN FRM <>10 AND SCR = '/' THEN SCR2 + LEAD(SCR2) OVER( ORDER BY FRM, ORD) WHEN FRM <>10 AND SCR = 'X' THEN SCR2 + LEAD(SCR2, 1) OVER( ORDER BY FRM, ORD) + LEAD(SCR2, 2) OVER( ORDER BY FRM, ORD) ELSE SCR2 END AS 얻은점수 FROM (SELECT FRM, ORD, SCR, DECODE(SCR, '/', 10 - LAG(SCR) OVER(ORDER BY FRM, ORD) , 'X', 10, SCR) AS SCR2 FROM T WHERE T.SCR IS NOT NULL ) )