| Col1 | Col2 |
| A | 10 |
| B | 20 |
| C | 10 |
| D | 30 |
위와 같은 테이블을 하나의 쿼리를 이용하여 아래와 같은 모양으로 출력하라.
| A | 10 | 10 |
| B | 20 | 30 |
| C | 10 | 40 |
| D | 30 | 70 |
며칠에 걸친 고민에 고민. -_-?????
거기에 특별한 함수를 쓰지 않고 풀려고 노력했다.
그리고... 어제 저녁에 rownum을 갖고 비교하면 되지 않을까라는 생각으로 아래와 같은 쿼리를 짰었다.
물론, 집에는 컴퓨터가 없는 관계로 손으로 쓱싹쓱싹 쓴 손 쿼리. ㅋ
SELECT A.col1
, A.col2
, (A.col2 + (SELECT SUM(B.col2) FROM table1 B
WHERE ROWNUM < A.ROWNUM-1)
) col3
FROM table1 A
, A.col2
, (A.col2 + (SELECT SUM(B.col2) FROM table1 B
WHERE ROWNUM < A.ROWNUM-1)
) col3
FROM table1 A
실행해보니까, rownum을 rownum으로 비교가 안된다. -.-;;
지대 좌절. ㅠ_ㅠ
이왕 손에 잡은거 풀어보겠다느 생각으로 매달려봤다.
문득 저 col1의 값들이 눈에 들어왔다.
문자도 숫자로 변환이 가능하다는 생각이 들었다. 그리고 책에서 봤던 ASCII라는 함수도 떠올랐다.
그리고는 열심히 쿼리 짰다. ^^v
SELECT A.col1, A.col2
,(A.col2 + (SELECT NVL(SUM(B.COL2), 0)
FROM table1 B
WHERE ASCII(B.col1) < ASCII(a.col1)
)
) col3
FROM table1 A
위의 쿼리가 문제와 같은 결과를 return한다. V^___^V,(A.col2 + (SELECT NVL(SUM(B.COL2), 0)
FROM table1 B
WHERE ASCII(B.col1) < ASCII(a.col1)
)
) col3
FROM table1 A
그리고 이 쿼리는 NVL 함수를 isNULL로 교체하면 Oracle과 MS-SQL 모두에서 실행된다.
사용해본 DBMS가 위의 두 개 밖에 없어서, 다른 DBMS는 어떤지 잘 모르겠다. ^^;
즉, 특정 DBMS에 종속되는 특별난 함수를 쓰지 않는 것이 장점(?)이라고 할 수 있겠다. (지나친 자화자찬인가?)
실행결과?
만족스럽다. 하하하 ^______________^
고민했던 보람이 있다. ^_^
불교에서 말하는 돈오점수라는 말. 요즘들어 가끔 느끼고 있다.
깨달음이란 한순간이라는 것.
그렇지만 그 깨달음을 얻기 위해서는 평소에 부단히 노력해야하고, 중간에 지치지 않을 수 있는 스테미너가 필요하다.
지치지 말자. 조금 힘들고, 누군가 나를 뒤에서 조롱할지라도 내가 지치지 않으면 어느 순간에는 나를 조롱하던 사람들을 앞질러 있을테니까.
욕속부달이다... ^^
오늘처럼 열심히 노력하고, 공부하자!


