1 2 3 4 5 6 7 8 9 10 11 12 | WITH BASE AS ( SELECT '401' CODE , '1' CODE_GROUP , '3' GRADE, '10' POINT , '20120201' INPUT_DATE FROM DUAL UNION ALL SELECT '402' CODE , '1' CODE_GROUP , '2' GRADE, '100' POINT , '20120301' INPUT_DATE FROM DUAL UNION ALL SELECT '403' CODE , '1' CODE_GROUP , '1' GRADE, '1000' POINT , '20120401' INPUT_DATE FROM DUAL UNION ALL SELECT '404' CODE , '1' CODE_GROUP , '1' GRADE, '1000' POINT , '20120501' INPUT_DATE FROM DUAL UNION ALL SELECT '405' CODE , '1' CODE_GROUP , '1' GRADE, '1000' POINT , '20120601' INPUT_DATE FROM DUAL UNION ALL SELECT '407' CODE , '2' CODE_GROUP , '3' GRADE, '10' POINT , '20120101' INPUT_DATE FROM DUAL UNION ALL SELECT '408' CODE , '2' CODE_GROUP , '2' GRADE, '100' POINT , '20120201' INPUT_DATE FROM DUAL UNION ALL SELECT '409' CODE , '2' CODE_GROUP , '1' GRADE, '1000' POINT , '20120301' INPUT_DATE FROM DUAL UNION ALL SELECT '410' CODE , '3' CODE_GROUP , '1' GRADE, '1000' POINT , '20120201' INPUT_DATE FROM DUAL UNION ALL SELECT '411' CODE , '3' CODE_GROUP , '2' GRADE, '100' POINT , '20120301' INPUT_DATE FROM DUAL ) SELECT * FROM BASE ; |
1 2 3 4 5 | WITH RESULT1 AS ( SELECT '1' CODE_GROUP , '1110' SUM_POINT FROM DUAL UNION ALL SELECT '2' CODE_GROUP , '1110' SUM_POINT FROM DUAL UNION ALL SELECT '3' CODE_GROUP , '1000' SUM_POINT FROM DUAL ) SELECT * FROM RESULT1 ; |
1 2 3 4 5 | WITH RESULT_FINAL AS ( SELECT '1' CODE_GROUP , '1110' SUM_POINT FROM DUAL UNION ALL SELECT '2' CODE_GROUP , '1110' SUM_POINT FROM DUAL UNION ALL SELECT '3' CODE_GROUP , '1000' SUM_POINT FROM DUAL ) SELECT SUM (SUM_POINT) FROM RESULT_FINAL ; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | --근데 위에 최종 결과가 3220인데, 3320이 정답 아닌가요? --CODE_GROUP 3를 보면, 서로 다른 등급 GRADE (1, 2) 2개 있습니다. 2개 더하면 1100입니다. --근데 중간 결과에 1000으로 되어 있네요. --단서를 보면 1000이 맞다고 되어 있는데, 이게 code_group 기준으로 grade가 높은 등급이 있어 --2번째 등급을 취하지 않는다는 것인데 이런 기준으로 본다면 다른 code_group도 높은 1등급이 있으니 --2등급, 3등급 데이타를 취하지 않아야 할 것 같은데.... (난독증 + 머리나쁨... ㅠㅠ) SELECT SUM (POINT) POINT FROM ( SELECT CODE_GROUP, GRADE, POINT FROM BASE GROUP BY CODE_GROUP, GRADE, POINT ); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | WITH BASE AS ( SELECT '401' CODE , '1' CODE_GROUP , '3' GRADE, '10' POINT , '20120201' INPUT_DATE FROM DUAL UNION ALL SELECT '402' CODE , '1' CODE_GROUP , '2' GRADE, '100' POINT , '20120301' INPUT_DATE FROM DUAL UNION ALL SELECT '403' CODE , '1' CODE_GROUP , '1' GRADE, '1000' POINT , '20120401' INPUT_DATE FROM DUAL UNION ALL SELECT '404' CODE , '1' CODE_GROUP , '1' GRADE, '1000' POINT , '20120501' INPUT_DATE FROM DUAL UNION ALL SELECT '405' CODE , '1' CODE_GROUP , '1' GRADE, '1000' POINT , '20120601' INPUT_DATE FROM DUAL UNION ALL SELECT '407' CODE , '2' CODE_GROUP , '3' GRADE, '10' POINT , '20120101' INPUT_DATE FROM DUAL UNION ALL SELECT '408' CODE , '2' CODE_GROUP , '2' GRADE, '100' POINT , '20120201' INPUT_DATE FROM DUAL UNION ALL SELECT '409' CODE , '2' CODE_GROUP , '1' GRADE, '1000' POINT , '20120301' INPUT_DATE FROM DUAL UNION ALL SELECT '410' CODE , '3' CODE_GROUP , '1' GRADE, '1000' POINT , '20120201' INPUT_DATE FROM DUAL UNION ALL SELECT '411' CODE , '3' CODE_GROUP , '2' GRADE, '100' POINT , '20120301' INPUT_DATE FROM DUAL ) SELECT CODE_GROUP , SUM ( CASE WHEN GRADE <= MIN_GRADE THEN POINT END ) PT FROM ( SELECT DISTINCT MIN (GRADE) OVER(PARTITION BY CODE_GROUP ORDER BY CODE) MIN_GRADE ,CODE_GROUP , GRADE , POINT FROM BASE ) GROUP BY ROLLUP (CODE_GROUP) ORDER BY CODE_GROUP |