Tech/Dev

행 열 변환

onesixx 2013. 4. 29. 10:38
반응형

http://www.oracleclub.com/article/23134

 

" 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)
위의 분석함수는 강좌란에 있습니다..^ㅡ^; 홧팅

반응형