2014-03-07 2 views
0

합계 열의 선행 행과 함께 열의 값을 계산하는 추가 열을 만들고 싶습니다. 아래는 쿼리입니다. 나는 롤업 (ROLLUP)을 사용했지만 그 목적을 달성하지 못했습니다. 다른 열의 수에서 이전 행의 값을 계산하는 방법

select to_char(register_date,'YYYY-MM') as "registered_in_month" 
     ,count(*) as Total_count 
from CMSS.USERS_PROFILE a 
where a.pcms_db != '*' 
group by (to_char(register_date,'YYYY-MM')) 
order by to_char(register_date,'YYYY-MM') 

내가

registered_in_month TOTAL_COUNT 
------------------------------------- 
2005-01    1 
2005-02    3 
2005-04    8 
2005-06    4 

을 얻을하지만 내가 표시하고자하는 것은에서 누락 개월을 포함하는 0

registered_in_month TOTAL_COUNT SUM 
------------------------------------------ 
2005-01    1   1 
2005-02    3   4 
2005-03    0   4 
2005-04    8   12 
2005-05    0   12 
2005-06    4   16 
+0

- 여러 있어야한다 (1) 월별로 집계, 누락 개월을 포함하여가 (달력 표가 대단히 당신을 도울 것) 2) 실행 합 이 사이트의 예). –

+0

동의. 하지만 문제는 어떻게 행을 합산 한 결과로 count (*)에서 결과가 났는지 확신 할 수 없다는 것입니다. 누군가가 그걸 보여줄 수 있다면 좋을 것 같습니다. – user3361530

+0

제가 게시 한 질문은 당신이 복제본으로 언급 한 것과 완전히 다릅니다. 누구든지 최대한 빨리 도와주세요. SQL에 대한 많은 지식이 없기 때문에 응답 시간이 – user3361530

답변

2

로 계산이 달을 포함하여, 아래 무엇 당신의 결과, 첫째로 당신은 달의 완전한 명부가있을 필요가있다. 그렇게하려면 가장 빠른 월과 가장 늦은 달을 찾은 다음 하위 목록 을 사용하여 전체 목록을 생성해야합니다. 당신은 모든 개월이되면

SQL Fiddle

with x(min_date, max_date) as (
    select min(trunc(register_date,'month')), 
     max(trunc(register_date,'month')) 
    from users_profile 
) 
select add_months(min_date,level-1) 
from x 
connect by add_months(min_date,level-1) <= max_date; 

, 당신은 당신의 테이블에 외부 조인 할 수 있습니다. 누적 합계를 얻으려면 단순히 SUM을 분석 함수로 추가하십시오.

with x(min_date, max_date) as (
    select min(trunc(register_date,'month')), 
     max(trunc(register_date,'month')) 
    from users_profile 
), 
y(all_months) as (
    select add_months(min_date,level-1) 
    from x 
    connect by add_months(min_date,level-1) <= max_date 
) 
select to_char(a.all_months,'yyyy-mm') registered_in_month, 
     count(b.register_date) total_count, 
     sum(count(b.register_date)) over (order by a.all_months) "sum" 
from y a left outer join users_profile b 
     on a.all_months = trunc(b.register_date,'month') 
group by a.all_months 
order by a.all_months; 

출력 :

이 두 부분으로있다
| REGISTERED_IN_MONTH | TOTAL_COUNT | SUM | 
|---------------------|-------------|-----| 
|    2005-01 |   1 | 1 | 
|    2005-02 |   3 | 4 | 
|    2005-03 |   0 | 4 | 
|    2005-04 |   8 | 12 | 
|    2005-05 |   0 | 12 | 
|    2005-06 |   4 | 16 | 
+0

+1 - 오라클의 경우 'TRUNC (...) '조인의 일부로 인덱스 사용을 무효화 할 수 있습니까? 그렇다면 'ON b.register_date> = a.all_months AND b.register_date

관련 문제