Temat: Raport z rozszerzoną opcją RollUp
Ja na potrzeby "kontrolera" musiałem zrobić takiego "potworka" i działa poprawnie podając sprzedaż, narastająco od początku roku dla roku obecnego i kilku poprzednich lat... dla dowolnej daty roku.
"
select A.ROK, A.MIESIAC, C.DNI_SPRZ, sum(B.WARTNETTO * A.KURS_WALUTY) as WART_PLN, sum(B.ILOSC) as ILE,
sum(B.WARTNETTO * A.KURS_WALUTY) / sum(B.ILOSC) as ZA_ILE, sum(B.CENA_EWID * B.ILOSC) as WART_EWID,
sum(B.CENA_EWID * B.ILOSC) / sum(B.ILOSC) as WART_EWID_SZT,
sum(B.WARTNETTO * A.KURS_WALUTY) - sum(B.CENA_EWID * B.ILOSC) as POT_ZYSK,
(sum(B.WARTNETTO * A.KURS_WALUTY) - sum(B.CENA_EWID * B.ILOSC)) / sum(B.ILOSC) as POT_ZYSK_SZT,
100 * ((sum(B.WARTNETTO * A.KURS_WALUTY) - sum(B.CENA_EWID * B.ILOSC)) / sum(B.ILOSC)) / (sum(B.CENA_EWID * B.ILOSC) / sum(B.ILOSC)) as PROC_MAR ,
case when (c.dni_sprz =0)then 0 else (sum(B.wartnetto * A.KURS_WALUTY)/c.dni_sprz) end sr_na_dzien_PLN
from M_FAKTURY A
inner join M_FAKTURYPOZ B on B.ID_NAG = A.ID_NAG
inner join(select ROK, MIESIAC, count(DZIEN) DNI_SPRZ
from (select distinct ROK, MIESIAC, F_DAY(DATA_FAK) DZIEN
from M_FAKTURY
where ROK > 2012 and
MIESIAC = F_MONTH(:DATA_DO) and
F_DAY(DATA_FAK) <= F_DAY(:DATA_DO))
group by ROK, MIESIAC) C on C.ROK = A.ROK and
C.MIESIAC = A.MIESIAC
where A.ROK > 2012 and
A.MIESIAC = F_MONTH(:DATA_DO) and
F_DAY(A.DATA_FAK) <= F_DAY(:DATA_DO)
group by A.ROK, A.MIESIAC, C.DNI_SPRZ
union
select A.ROK, 'RAZEM', C.DNI_SPRZ, sum(B.WARTNETTO * A.KURS_WALUTY) as WART_PLN, sum(ILOSC) as ILE,
sum(B.WARTNETTO * A.KURS_WALUTY) / sum(B.ILOSC) as ZA_ILE, sum(B.CENA_EWID * B.ILOSC) as WART_EWID,
sum(B.CENA_EWID * B.ILOSC) / sum(B.ILOSC) as WART_EWID_SZT,
sum(B.WARTNETTO * A.KURS_WALUTY) - sum(B.CENA_EWID * B.ILOSC) as POT_ZYSK,
(sum(B.WARTNETTO * A.KURS_WALUTY) - sum(B.CENA_EWID * B.ILOSC)) / sum(B.ILOSC) as POT_ZYSK_SZT,
100 * ((sum(B.WARTNETTO * A.KURS_WALUTY) - sum(B.CENA_EWID * B.ILOSC)) / sum(B.ILOSC)) / (sum(B.CENA_EWID * B.ILOSC) / sum(B.ILOSC)) as PROC_MAR ,
case when (c.dni_sprz =0)then 0 else (sum(B.wartnetto * A.KURS_WALUTY)/c.dni_sprz) end sr_na_dzien_PLN
from M_FAKTURY A
inner join M_FAKTURYPOZ B on B.ID_NAG = A.ID_NAG
inner join(select WW.ROK, coalesce(YY.DNI_SPRZ, 0) + coalesce(XX.DNI_SPRZ, 0) DNI_SPRZ
from (select distinct ROK
from M_FAKTURY
where ROK > 2012 and
DATA_FAK <= :DATA_DO) WW
left join(select ROK, MIESIAC, count(DZIEN) DNI_SPRZ
from (select distinct ROK, MIESIAC, F_DAY(DATA_FAK) DZIEN
from M_FAKTURY
where ROK > 2012 and
MIESIAC = F_MONTH(:DATA_DO) and
F_DAY(DATA_FAK) <= F_DAY(:DATA_DO))
group by ROK, MIESIAC) YY on YY.ROK = WW.ROK
left join(select X.ROK, count(X.DZIEN) DNI_SPRZ
from (select distinct ROK, MIESIAC, F_DAY(DATA_FAK) DZIEN
from M_FAKTURY
where ROK > 2012 and
MIESIAC < F_MONTH(:DATA_DO)) X
group by X.ROK) XX on XX.ROK = WW.ROK) C on C.ROK = A.ROK
where A.ROK > 2012 and
(A.MIESIAC < F_MONTH(:DATA_DO) or (A.MIESIAC = F_MONTH(:DATA_DO) and
F_DAY(A.DATA_FAK) <= F_DAY(:DATA_DO)))
group by A.ROK, C.DNI_SPRZ
"
Wygląda potwornie ale wyświetla raport linijka po linijce.
najpierw aktualny miesiąc z roku do podanej daty, potem podsumowanie roku do podanej daty i tak przez wszystkie dopuszczalne lata....
Obrazka nie podam. :)
dla bazy firebird i środowiska REKORD - funkcje F_DAY, F_YEARitp.
Jak osiwiejesz przy analizie, daj znać.. Życie to nie bajka. :)