최초에 저도 이 요구사항을 받아들였을때 막막함을 느꼈습니다. 일단, 데이터가 어떤 형태로 생겨있는지 그 규칙을 찾는데에 시간이 걸린 것이죠. (사실 그때는 MS-SQL의 문법만 열씨미 공부했기 때문이었는지, 제가 게을러서 였는지 "대용량 데이터베이스"라는 책이 있다는 사실조차 모를정도로 초보였습니다. 머, 지금도 마찬가지 입니다만 -_-;;) 일단, 달력안에 들어가 있는 값들이 가지고 있는 의미가 무엇인지부터 한번 살펴봅시다.
위의같은 결과를 만들어내기 위해서 필요한 집합은 무엇일까요? 일단, 4월의 각 일자를 가진 집합이 필요합니다. 이 집합은 각 일자마다 어떤 요일에 해당하는지 정보를 가지고 있어야합니다. 그리고 각 일자는 다시 달력의 몇주차에 해당하는지 주차정보를 알아야합니다. 일단 우리는 4월의 각일자를 가지고 있는 테이블이 TSCWIFU 이런 이름으로 있다고 가정합니다. 이 집합은 년월일이 저장된 달력값들을 가진 테이블입니다. 이 테이블에 2006년4월에 해당하는 정보만을 읽어오면 일자집합은 해결됐습니다.
각 특정일자가 어떤 요일에 해당하는지 알아내기 위해서는 TO_CHAR('20060401', 'D') 이 함수를 사용하면 됩니다. 여기서 'D'는 일요일인 경우 1, 월요일은 2, ... 토요일은 7까지 7개의 값을 반환하게 됩니다. 이제 마지막으로 각 일자가 가지고 있어야 하는 달력의 주차에 대한 정보를 어떻게 만들어줄 수 있을까요?
오라클에서 제공해주는 함수 중에서 TO_CHAR('20060401', 'w') 이런 포맷이 있습니다. 이함수는 주차값을 리턴한다고 합니다만, 실제 출력해보면 그 주차라는 것이 우리나라달력에 나온 주차와는 개념이 다르다는 것을 아실수 있을겁니다. (그냥 1~7일은 1주차,8~14일은 2주차.... 이렇게 나옵니다).
그렇다면 이개념이 아닌 달력의 주차를 알아내기 위해서는 가장먼저 알아야 하는 값이 무엇일까요? 각 일자와는 다르게 이 일자가 어느곳부터 나타나야하는지를 알면됩니다. 즉, 달력의 일자와 적히는 위치 이 두개의 개념으로 나누어서 생각하면 됩니다. 위의 경우에 1일의 요일을 구해보면 7의 값이 나옵니다. 즉, 7번째 칸부터시작이다라는 것이고, "6칸은 비어있는 칸이 있다"는 것입니다.
그렇다면 각 일자별로 비어있는 칸 + 날짜를 더해서 7로 나눈 나머지를 취하면 나타나야 할 위치가 정해지게 됩니다. 그리되면, 줄이 바뀌는 것은 어떻게 알 수 있을까요? 비어있는 칸 + 날짜를 7로 나누어서 그 몫을 올림하면 몇번째줄인지 즉, 몇번째 주차인지를 알게 됩니다. 이제, 준비는 끝났습니다. 그런 집합을 만들어내기만 하면되는거죠. 아래의 쿼리를 수행해봅시다.
실제로 우리가 원하는 집합이 나타났는지부터 확인해 봅시다.
위와 같이 정확하게 나오는 것을 확인 할 수 있습니다. 이제 일의 반은 끝났군요. 이제 데이터를 GROUPING하면 됩니다. 무엇으로 GROUPING을 할까요? 당연히 C_MONTH,C_WEEK로 해야겠죠? 그리고 위치는 C_DAY가 나타내는 곳에다가 C_DD의 값을 표현해 주면 됩니다. 이제 쿼리를 완성하면 아래와 같습니다.
|