2012-07-11 3 views
8

: 나는이 데이터를 조회 할 때SQL 그룹으로 - 인서트 월/년, 오류 당 계산 기록 - 유효한 MONTH 나는이 예제 데이터가

Country | Members | Joined 
USA  | 250  | 1/1/2012 
USA  | 100  | 1/8/2012 
Russia | 75  | 1/20/2012 
USA  | 150  | 2/10/2012 

나는 모든 기록을 집계하고 싶습니다 주어진 달. 즉 충분히 간단 인 선택으로

Country | Members | Joined 
USA  | 350  | 1/2012 
Russia | 75  | 1/2012 
USA  | 150  | 2/2012 

: 같은 쿼리의 결과는 보일 것이다,

select country, count(*) as members , to_char(trunc(joined), 'MM-YYYY') 
from table 
group by country, to_char(trunc(joined), 'MM-YYYY') 

는 그 쿼리가 내가 원하는 형식으로 나에게 데이터를 제공 할 것이다 그러나 나의 문제는 때이다 I 새로운 피벗 테이블에 삽입하십시오. select 문에서 to_char()가 DATETIME 열에 위치하기 때문에 오류가 발생합니다 (오류 : ORA-01843 - 유효한 달이 아님)

to_char() 선택 to_date(), 여전히 작동하지 않습니다 (동일한 오류, ORA-01843 - 않음 유효 기간) :

select country, count(*) as members, to_date(trunc(joined), 'MM-YYYY') 
from table 
group by country, to_date(trunc(joined), 'MM-YYYY') 

나는 그 새 테이블에 결과를 삽입 할 수있는 방식으로이 쿼리를 수정하는 방법에 대한 어떤 제안이 "JOINED"열이 형 DATETIME이다?

미리 감사드립니다. 팁/제안/의견을 보내 주셔서 감사합니다!

답변

14

to_date('01/'||trunc(joined), 'DD/MM/YYYY')과 같은 작업을 수행하면 유효한 날짜로 바뀝니다.

select country, count(*) as members, EXTRACT(MONTH FROM joined) as mn, EXTRACT(YEAR FROM JOINED) as yr,MIN(JOINED) as dt 
from table 
group by country, EXTRACT(MONTH FROM joined), EXTRACT(YEAR FROM JOINED) 

다음 것과, 당신은 할 수 : 해당 월의 첫 번째 또는 마지막 날을 사용할지 여부를 결정해야합니다

또 다른 옵션은 추출 기능을 사용하는 것입니다 (마지막으로 더 복잡하다) dt 열을 선택하여 삽입하십시오.

+0

내 머리 속에는 이것이 정확하게 파악하려고 한 것입니다. 감사합니다! –

5

trunc 함수를 사용하여 날짜를 첫 달로 자르십시오. 이렇게하면 날짜를 문자열로 변환하고 문자열을 날짜로 다시 변환해야 할 필요가 없습니다.

select country, 
     count(*) as members , 
     trunc(joined, 'MM') 
    from table 
group by country, 
      trunc(joined, 'MM') 
+0

좋은 제안, 이것에 대해 알아 보겠습니다. 의견을 보내 주셔서 감사합니다. –