2013-08-12 1 views
0

나는이 이런 식으로 한 행에 60 일 전에 내 데이터베이스 (SYSDATE-60)를 memberbase를 반환하는 기존 조회 :Oracle/SQL - "union all"이 아닌 여러 개의 재귀 쿼리?

date - - - - members 
sysdate-60 200.000 

나는 일이 하나의 여러 쿼리의 결과를 결합하려는

date - - - - members 
sysdate-60 200.000 
sysdate-59 210.000 
sysdate-58 220.000 

내가 수동으로 모든 단일 쿼리의 날짜를 편집하여 그것을하고 "UNION ALL"을 사용할 수 있지만, 이것은 성가신 : 순서대로 쿼리는 다음과 같은 결과를 얻을 수 있습니다. 나는 더 나은 해결책을 찾고있다.

"재귀 쿼리"를 발견하고 이것이 내 문제를 해결할 수 있다고 생각했지만 필요에 맞게 사용자 지정할 수 없었습니다. 너는 할수 있니?

답장을 찾으십시오.

편집 : <

SELECT sysdate-60 AS date, count(*) AS members FROM members WHERE start_date<sysdate-60 AND end_date>=sysdate-60 
+0

db의 필드/테이블 이름을 추측하기는 어렵습니다. 현재 사용중인 검색어를 게시하십시오. – alfasin

+0

모든 ** 날짜에 대해 ** 단일 ** 레코드가 있습니까? –

+0

재귀 쿼리는 옳은 대답이 아닐 수 있습니다. 회원 테이블의 구조와 기존 쿼리를 게시 할 수 있습니까? 회원 FROM COUNT (*), SYSDATE-1을 선택 –

답변

1

당신의 번호를 생성하는 쿼리를 사용할 수 있습니다 :

이의이 내가 사용하는 쿼리 있다고 가정하자 회원의 양을 검색 할 다른 방법이 없다는 것을 1에서 60 :

select level from dual connect by level <= 60; 

그런 다음 기존 쿼리와 결합하십시오.

select 'sysdate('|| d|| ')' 
     , sum(case round(sysdate - created) when d then 1 else 0 end) 
    from 
     user_objects 
     , (select level d from dual connect by level <= 60) 
group by d  
order by 1 
; 

또는

SELECT sysdate - d, count(*) 
FROM members 
    , (select level d from dual connect by level <= 60) 
WHERE start_date<sysdate-d 
    AND end_date>=sysdate-d 
group by d 
; 
+0

에 의해 그룹,하지만 어떻게이 도와주세요? – user2675284

+0

기존 쿼리와 결합 할 수 있습니다 – schurik

+0

@ user2675284 답변에 대한 질문에 예제를 추가했습니다. – schurik

0

당신은이에 대한 재귀가 필요하지 않습니다; 카운터가 필요합니다.

이 쿼리는 현재 날짜로 끝나는, 당신에게 지난 60 일 목록을 제공합니다 :

SELECT TRUNC(SYSDATE) - LEVEL + 1 AS TheDate 
FROM DUAL 
CONNECT BY LEVEL <= 60 

을 목록 그냥 예에서 + 1을 제거, 어제 날짜로 끝나야합니다.

그러면 기본 쿼리에이를 추가 할 수 있으며 모든 UNION 개의 쿼리를 제거 할 수 있습니다.