[Oracle] Wartosc kolumny z pierwszego miesiaca roku

0

Witam,

Mam pewien problem i nie bardzo wiem jak go rozwiazac.

Załóżmy, że mam tabelę jak poniżej:

PERIOD || VALUE1 || VALUE2 || VALUE3 || ATR1 || ATR2

2016-12 || 450 || 650 || 850 || dd || dfg
2017-01 || 100 || 200 || 300 || aa || bb
2017-02 || 200 || 400 || 500 || cc || ddd
2017-03 || 300 || 600 || 700 || ee || ff

WHERE CODE = 1234

I teraz potrzebuje napisać zapytanie, gdzie oglądam ostatni miesiac - 2017-03, dla niego wyciągam wartosci VALUE2 i VALUE3 oraz atrybuty ATR1 i ATR2 jednak potrzebuje jeeszcze wartosc VALUE1 na koniec poprzedniego roku i wartosc VALUE1 na poczatek obecnego roku czyli mniej wiecej:

PERIOD || VALUE1 || VALUE2 || VALUE3 || VALUE1ENDOFYEAR || VALUE1STARTOFTYEAR || ATR1 || ATR2
2017-30 || 300 || 600 || 700 || 450 || 100 || ee || ff

Oczywiscie moge dociagnac daty jak pierwszy dzień kazdego miesiaca, ale nie wiem ja sie za to zabrac ze skonstruowac sql.
Podane dane sa tylko dla jednego kodu = 1234 a jest ich kilkanascie dlatego chciałbym zrobic to dla wszystkich (przykład jest wzorowany na jednym kodzie).

Jakiś pomysł jak sie za to zabrac?

0

Zrobiłbym pomocnicze zapytanie które wyciągnie dane na konic/początek roku i lef joinem się połączył z tabelą główna:

    SELECT 
        CODE
        ,SUBSTR(PERIOD,1,4) + CASE WHEN SUBSTR(PERIOD,-2)='12' THEN 1 ELSE 0 END Y
        ,max(CASE WHEN SUBSTR(PERIOD,-2)='01' THEN VALUE1 ELSE 0 END) CurYear
        ,max(CASE WHEN SUBSTR(PERIOD,-2)='12' THEN VALUE1 ELSE 0 END) PrevYear
    FROM
        DT
    group by
        CODE
        ,SUBSTR(PERIOD,1,4) + CASE WHEN SUBSTR(PERIOD,-2)='12' THEN 1 ELSE 0 END

http://sqlfiddle.com/#!4/231a6/40

0

Można też tak:

select a.period, a.value1, a.value2, a.value3, b.value1 v1p, c.value1 v2p, a.atr1, a.atr2

from tab a

left join tab b
on a.code = b.code
and trunc(to_date(a.period, 'yyyy-mm'),'yy') = to_date(b.period, 'yyyy-mm')

left join tab c
on a.code = c.code
and add_months((to_date(a.period, 'yyyy-mm'),'yy'), -1) = to_date(c.period, 'yyyy-mm')

where a.code = 1234

1 użytkowników online, w tym zalogowanych: 0, gości: 1