[힌트] 행 열 변환<기초편> 1 3 22,072

by 호야 DECODE MIN [2009.01.06 15:47:31]


처음 초급 SQL을 만들다 보면 항상 거쳐 과정이라 말할 수 있는 상위 문제에 대해 끄적거려 봅니다
상위 문제와 답을 비교 하며, 어떤 것이 달라 졌는가를 먼저 보도록 합니다.
간소화된 SQL 문제라서 그런지 한눈에 딱 들어 옵니다.. 
결론은 " CODE를 그룹으로 묶어서 그룹화 된 내용들을 가로로 표현을 한다"
일반 프로그램으로 짠다면... 그냥 변수에 넣어서 루프 돌리는 곳에 IF 넣으면 쉽게 끝나지 않느냐~~~
합니다... 저도 그러게 생각 했구요, 근데 도통 SQL 로 만들자니 답이 안 나오네요.
왜 프로그램 로직으로는 쉽게 나오는데 SQL은 안 나올까 해서 고민했더니 답은 2개더군요.

첫째. 난 SQL의 함수를 잘 알지 못한다.
둘째. 딱 한줄씩만 읽는다..-_- 무슨 386컴퓨터도 아니고 한줄씩 보는 습관이 생겨 버렸네요.

그렇습니다. 프로그램의 입문을 하기위해서도 변수, IF, FOR, LOOP 문 등 여러 함수를 배우고 다음 학습을
시작하게 됩니다. SQL도 기본함수들은 배우 셨을 겁니다. 하지만 자기것으로 만드신 분은 드물 겁니다.

그럼, 기초적인 문제를 먼저 풀고 시작을 해보도록 합니다.

A 컬럼                           A 컬럼    B 컬럼    C컬럼
=====                        ====================
   1                                      1             2             3
   2                  =>
   3

어떻게 표현하나요?(왜 개그 콘서트에 사투리 개그가 생각날까요? 아..참..)
먼저 이놈들을 이산가족화를 시켜 줍니다. 아래와 같이

SELECT DECODE(A컬럼,1,A컬럼) A컬럼,
                DECODE(B컬럼,1,B컬럼) B컬럼,
                DECODE(C컬럼,2,C컬럼) C컬럼
FROM 테이블

 A 컬럼    B 컬럼    C컬럼
====================
      1
                     2
                                     3
위와 같이 바뀌었네요..
어라, 근데 왜 답이 아니지?? 으흠.. 곰곰히 생각을 해 봅시다.
또 무엇이 필요 한지.....

답은 그리 멀지 않은 곳에 있었습니다. 우리가 SQL문을 쓰면서 가장 자주 쓰는 숫자함수
MAX,MIN,SUM,AVG 등이 그것이었네요
여기서는  MIN 을 쓰도록 하겠습니다.( 왜냐구요? 몰라요.. 어떤분이 MIN이 효율이 젤 좋다하네요^^ 믿거나 말거나)
DECODE문에 MIN을 덮어 쓰게 됩니다. 그렇게 되면, 전체 로우중 최저의 값을 뽑아 오겠죠?
하지만 NULL 보다는 MIN 이 크기 때문에 NULL 은 제외가 되는 겁니다.

SELECT MIN(DECODE(A컬럼,1,A컬럼)) A컬럼,
                MIN(DECODE(B컬럼,1,B컬럼)) B컬럼,
                MIN(DECODE(C컬럼,2,C컬럼)) C컬럼
FROM 테이블


결과는??
A 컬럼    B 컬럼    C컬럼
====================
      1             2             3

오옷, 드디어 기초 문제의 답이 나왔군요.

위에 설명했듯이 프로그램이나 SQL이나 결과에 대한 이미지화가 중요한 것 같습니다.
특히나 테이블 전체에 대한 명령을 수행하는 SQL에서는 더욱 더 중요하다고 할 수 있겠죠

문제에 대한 답을 쓸려고 했으나, 항상 스스로 해결하는 것이 좋으실것 같아서... 요 만큼만 쓰겠습니다.^^:
담에는 분석함수에 대해서 끄적 거려 보겠습니다.. ㅎㅎㅎ 그럼 안녕히~

마지막 힌트 
본 문제의 필요한 것은 그룹화 이며, 어떠한 패턴으로 저들을 구분을 할 수 있을지가 핵심입니다
제 생각에는 분석함수가 필요할듯 싶군요..-_- 이런
ROW_NUMBER() OVER(PARTITION BY CODE ORDER BY ROWNUM)
위의 분석함수는 강좌란에 있습니다..^ㅡ^; 홧팅

by madcat [2009.01.06 16:38:34]
열의가 넘치시네요^^

by 장태길 [2009.01.07 00:21:57]
굿 잡..
이런건 항상 어렵다는..

by ... [2009.01.07 08:22:03]
감사하모니다^^^
대단히 감사하모니다^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입