2017-12-20 3 views
0

에서 올해의 모든 개월에 해당하는 기록을 얻을 수 있습니다 :어떻게 데이터 집합이 오라클

Month id1 id2 id3 value 

Jan-17 1 2 3  67 
Feb-17 2 3 4  43 

가 어떻게 년의 모든 달에 해당하는 (id1, id2, id3)의 조합을 얻는가를?

예 : 나는 1 월 17 일부터 시작하는 경우 :

month id1 id2 id3 value 
jan-17 1 2 3  67 
feb-17 1 2 3  0 
mar-17 1 2 3  0 
apr-17 1 2 3  0 
may-17 1 2 3  0 
jun-17 1 2 3  0 
jul-17 1 2 3  0 
aug-17 1 2 3  0 
sep-17 1 2 3  0 
oct-17 1 2 3  0 
nov-17 1 2 3  0 
dec-17 1 2 3  0 
jan-17 2 3 4  0 
feb-17 2 3 4  43 
mar-17 2 3 4  0 
apr-17 2 3 4  0 
may-17 2 3 4  0 
jun-17 2 3 4  0 
jul-17 2 3 4  0 
aug-17 2 3 4  0 
sep-17 2 3 4  0 
oct-17 2 3 4  0 
nov-17 2 3 4  0 
dec-17 2 3 4  0 
+0

첫 번째 기록에서'id1 = 1, id2 = 2, id3 = 3'을 다른 모든 달로 복제합니까? 왜 잰 -17 두 개와 feb17 두 개 있어요? 원하는 출력을위한 논리를 설명하십시오. [** How-to-Ask **] (http://stackoverflow.com/help/how-to-ask) \t \t 그리고 [** 시작 **] (http : //spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/) 질문 품질을 향상시키고 더 나은 답변을 얻는 방법을 배우십시오. –

+0

자세한 정보가 필요합니다. 몇 개의 ID가 있습니까? – Guru

+0

안녕하세요 !! ID가 여러 개 있습니다. 모든 달에 대해 각각의 ID가 나타납니다. – joe

답변

3

당신이 년 동안 모든 개월을 생성 할 수 있습니다 출력은 다음과 같이 보일 것이다

select add_months(date '2017-01-01', level - 1) 
from dual 
connect by level <= 12 

그리고 당신은 ID의 모든 조합을 얻을 수 있습니다 :

select distinct id1, id2, id3 from your_table 

당신은 모든 개월 동안 모든 ID의 조합을 얻을 도스을 교차 결합 할 수 있습니다

select month, id1, id2, id3 
from (
    select add_months(date '2017-01-01', level - 1) as month 
    from dual 
    connect by level <= 12 
) 
cross join (
    select distinct id1, id2, id3 from your_table 
) 

샘플 데이터에서 24 행을 제공합니다. 일치가 없을 때 그런 다음 다시 테이블 어떤 값을 선택하고, 제로를 사용하는 유착을 사용하는 것을 을 왼쪽에 가입 할 수 있습니다 :

만 다른 년에 나타납니다 ID의 조합이있는 경우
with cte (month, id1, id2, id3) as (
    select month, id1, id2, id3 
    from (
    select add_months(date '2017-01-01', level - 1) as month 
    from dual 
    connect by level <= 12 
) 
    cross join (
    select distinct id1, id2, id3 from your_table 
) 
) 
select cte.month, cte.id1, cte.id2, cte.id3, coalesce(t.value, 0) as value 
from cte 
left join your_table t on t.month = cte.month 
and t.id1 = cte.id1 
and t.id2 = cte.id2 
and t.id3 = cte.id3 
order by cte.id1, cte.id2, cte.id3, cte.month; 

MONTH    ID1  ID2  ID3  VALUE 
---------- ---------- ---------- ---------- ---------- 
2017-01-01   1   2   3   67 
2017-02-01   1   2   3   0 
2017-03-01   1   2   3   0 
2017-04-01   1   2   3   0 
2017-05-01   1   2   3   0 
2017-06-01   1   2   3   0 
2017-07-01   1   2   3   0 
2017-08-01   1   2   3   0 
2017-09-01   1   2   3   0 
2017-10-01   1   2   3   0 
2017-11-01   1   2   3   0 
2017-12-01   1   2   3   0 
2017-01-01   2   3   4   0 
2017-02-01   2   3   4   43 
2017-03-01   2   3   4   0 
2017-04-01   2   3   4   0 
2017-05-01   2   3   4   0 
2017-06-01   2   3   4   0 
2017-07-01   2   3   4   0 
2017-08-01   2   3   4   0 
2017-09-01   2   3   4   0 
2017-10-01   2   3   4   0 
2017-11-01   2   3   4   0 
2017-12-01   2   3   4   0 

및 포함 된 사람들을 싶지 않아 당신은 필터링하기 위해 ID 쿼리를 변경하여 지정된 연도에 어떤 데이터를 가질 수 만에 그것을 제한 할 수 있습니다 :

select distinct id1, id2, id3 from your_table 
where extract(year from month) = 2017 

또는

select distinct id1, id2, id3 from your_table 
where month between date '2017-01-01' and date '2017-12-01' 

저는 monthDATE 열이라고 가정합니다. 모든 값은 한 달의 첫날 자정입니다. 그러나 물론 디스플레이하기를 원하는 포맷을 지정할 수 있습니다.

MONTH    ID1  ID2  ID3  VALUE 
---------- ---------- ---------- ---------- ---------- 
2017-01-01   1   2   3   67 
2017-02-01   1   2   3   0 
2017-03-01   1   2   3   0 
... 
2017-01-01   2   3   4   0 
2017-02-01   2   3   4   43 
2017-03-01   2   3   4   0 
... 

만 : 같은 결과를 얻을 수

with months (month) as (
    select add_months(date '2017-01-01', level - 1) 
    from dual 
    connect by level <= 12 
) 
select m.month, t.id1, t.id2, t.id3, coalesce(t.value, 0) as value 
from months m 
left join your_table t partition by (t.id1, t.id2, t.id3) 
on t.month = m.month 
order by t.id1, t.id2, t.id3, m.month; 

: 우리는 별도의 단계에서 그 ID를 얻기의 partitioned outer join를 대신 사용할 수 있습니다 10g 이후


@boneist가 언급 한 바와 같이, 훨씬 간단합니다 (테이블을 한 번만 치면되므로 더 효율적입니다).

+0

한계는 단지 1 upvote이지만 여전히 Upvotes ....의 톤입니다! –

+4

분할 된 외부 조인을 사용하면 고유 ID를 찾을 필요가 없어 질 수 있다고 생각합니다. – Boneist

+2

@Boneist - 당연히 ... 물론 추가 하겠지만 스스로 대답하면 제거 할 것입니다. 감사. –

관련 문제