당신이 년 동안 모든 개월을 생성 할 수 있습니다 출력은 다음과 같이 보일 것이다
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'
저는 month
이 DATE
열이라고 가정합니다. 모든 값은 한 달의 첫날 자정입니다. 그러나 물론 디스플레이하기를 원하는 포맷을 지정할 수 있습니다.
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가 언급 한 바와 같이, 훨씬 간단합니다 (테이블을 한 번만 치면되므로 더 효율적입니다).
첫 번째 기록에서'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/) 질문 품질을 향상시키고 더 나은 답변을 얻는 방법을 배우십시오. –
자세한 정보가 필요합니다. 몇 개의 ID가 있습니까? – Guru
안녕하세요 !! ID가 여러 개 있습니다. 모든 달에 대해 각각의 ID가 나타납니다. – joe