[답변]자료를 범위별로 분류하는 SQL 질문드립니다 0 8 2,234

by 성시현 [2008.01.30 18:08:56]


네이버지식인...쿼리를 보니 약간 물이 흐려진 듯한 느낌이 들어 자책이 느껴지는 군요.

각설하고, 아래 결과를 확인 해 보세요.

문제에 설명하신 분류와 결과의 분류가 기준이 다르군요. 수정은 직접 해 보세요.

 

SELECT
      ml.times
    , SUM(CASE wHEN rn = 1 AND num1 BETWEEN 1 AND 10 THEN 1
               WHEN rn = 2 AND num2 BETWEEN 1 AND 10 THEN 1
               WHEN rn = 3 AND num3 BETWEEN 1 AND 10 THEN 1
               WHEN rn = 4 AND num4 BETWEEN 1 AND 10 THEN 1
               WHEN rn = 5 AND num5 BETWEEN 1 AND 10 THEN 1
               WHEN rn = 6 AND num6 BETWEEN 1 AND 10 THEN 1 END) AS 분류1
    , SUM(CASE wHEN rn = 1 AND num1 BETWEEN 11 AND 20 THEN 1
               WHEN rn = 2 AND num2 BETWEEN 11 AND 20 THEN 1
               WHEN rn = 3 AND num3 BETWEEN 11 AND 20 THEN 1
               WHEN rn = 4 AND num4 BETWEEN 11 AND 20 THEN 1
               WHEN rn = 5 AND num5 BETWEEN 11 AND 20 THEN 1
               WHEN rn = 6 AND num6 BETWEEN 11 AND 20 THEN 1 END) AS 분류2
    , SUM(CASE wHEN rn = 1 AND num1 BETWEEN 21 AND 30 THEN 1
               WHEN rn = 2 AND num2 BETWEEN 21 AND 30 THEN 1
               WHEN rn = 3 AND num3 BETWEEN 21 AND 30 THEN 1
               WHEN rn = 4 AND num4 BETWEEN 21 AND 30 THEN 1
               WHEN rn = 5 AND num5 BETWEEN 21 AND 30 THEN 1
               WHEN rn = 6 AND num6 BETWEEN 21 AND 30 THEN 1 END) AS 분류3
    , SUM(CASE wHEN rn = 1 AND num1 BETWEEN 31 AND 40 THEN 1
               WHEN rn = 2 AND num2 BETWEEN 31 AND 40 THEN 1
               WHEN rn = 3 AND num3 BETWEEN 31 AND 40 THEN 1
               WHEN rn = 4 AND num4 BETWEEN 31 AND 40 THEN 1
               WHEN rn = 5 AND num5 BETWEEN 31 AND 40 THEN 1
               WHEN rn = 6 AND num6 BETWEEN 31 AND 40 THEN 1 END) AS 분류4
    , SUM(CASE wHEN rn = 1 AND num1 BETWEEN 41 AND 50 THEN 1
               WHEN rn = 2 AND num2 BETWEEN 41 AND 50 THEN 1
               WHEN rn = 3 AND num3 BETWEEN 41 AND 50 THEN 1
               WHEN rn = 4 AND num4 BETWEEN 41 AND 50 THEN 1
               WHEN rn = 5 AND num5 BETWEEN 41 AND 50 THEN 1
               WHEN rn = 6 AND num6 BETWEEN 41 AND 50 THEN 1 END) AS 분류5
FROM  ml
    , (SELECT ROWNUM AS rn FROM dict WHERE ROWNUM <= 6) cp
GROUP BY ml.times
ORDER BY ml.times

by finecomp [2008.01.30 00:00:00]
네이버지식인 게시판 물갈이(?)작업은 저는 한가해진 뒤로 미룰 수 밖에 없겠군요.

여기 상주(?)하시는 많은 고수분들께서도 가끔 가서 고견들을 달아주시면 우리업계의 전반적인 Skill향상이 훨씬 빠를거라 믿습니다...^^;

by 채용근 [2008.01.30 00:00:00]
시현님 화팅 -_-;;

by 마농 [2008.01.30 00:00:00]
SELECT times
, SUM(CASE WHEN num BETWEEN 1 AND 10 THEN 1 END) "분류1"
, SUM(CASE WHEN num BETWEEN 11 AND 20 THEN 1 END) "분류2"
, SUM(CASE WHEN num BETWEEN 21 AND 30 THEN 1 END) "분류3"
, SUM(CASE WHEN num BETWEEN 31 AND 40 THEN 1 END) "분류4"
, SUM(CASE WHEN num BETWEEN 41 AND 50 THEN 1 END) "분류5"
FROM
(
SELECT times
, DECODE(rn,1,num1,2,num2,3,num3,4,num4,5,num5,6,num6) num
FROM ml
, (SELECT ROWNUM rn FROM dict WHERE ROWNUM <= 6) cp
)
GROUP BY times

by finecomp [2008.01.30 00:00:00]
아...감사합니다...^^;
그런데 오라클이 아니고 SQL Lite네요...ㅡ.ㅡ;
이건 무슨 DBMS죠...제가 무식해놔서리...;

, (SELECT ROWNUM AS rn FROM dict WHERE ROWNUM <= 6) cp
이 부분을 DBMS제품에 맞게 수정줘야겠군요.

개요는 각 row를 6번 copy한다는 의미입니다.
묻지마 조인으로 거의 대부분의 RDBMS들은 같은 의미의 쿼리를 만들 수 있습니다.

by finecomp [2008.01.30 00:00:00]
한눈에 SQL구문을 줄이는 순발력은 역시 마농님 발군이네요...^^;

by 마농 [2008.01.30 00:00:00]
다른방법으로 풀어봤습니다. 물론 오라클 기준.
SELECT times
, REPLACE(SUBSTR(a,-1,1),'0') "분류1"
, REPLACE(SUBSTR(a,-2,1),'0') "분류2"
, REPLACE(SUBSTR(a,-3,1),'0') "분류3"
, REPLACE(SUBSTR(a,-4,1),'0') "분류4"
, REPLACE(SUBSTR(a,-5,1),'0') "분류5"
FROM
(
SELECT times
, POWER(10,CEIL(num1/10)-1)
+ POWER(10,CEIL(num2/10)-1)
+ POWER(10,CEIL(num3/10)-1)
+ POWER(10,CEIL(num4/10)-1)
+ POWER(10,CEIL(num5/10)-1)
+ POWER(10,CEIL(num6/10)-1) a
FROM ml
)

by 윤선희 [2008.01.31 00:00:00]
정말 감사드립니다.
얼른 실행해봐야겠습니다.
단, decode는 sqlite에서 지원하지 않으니까 case로 바꿔서 해야겠군요...

by finecomp [2008.01.31 00:00:00]
아...POWER로...역시 수학을 응용하니 좋아지네요...;
대용량으로 갈 수록 성능면에서도 row copy가 없어 훨씬 좋아질 듯 하군요.
마농님 미처 생각 못한 좋은 쿼리 보여주셔서 감사합니다...^^;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입