Hi,
ich verwende für solche Fälle eine Procedure die mir den Zeitstrahl
vorgibt. Damit ist keine extra Tabelle notwendig.
Damit würde deine Abfrage so aussehen
SQL-Code:
select
JM.Jahr,
JM.Monat,
sum(PAYMENT) as SumPrice
from
SP_JJMM(:VonDatum, :BisDatum) JM
left join PAYMENTS P on (EXTRACT(YEAR from P.PAYMENT_DATE) = JM.JAHR AND EXTRACT(MONTH from P.PAYMENT_DATE) = JM.MONAT)
group BY
JM.Jahr,
JM.Monat
Edit: muss natürlich left join heißen..
oder so
SQL-Code:
select
JM.Jahr,
JM.Monat,
sum(PAYMENT) as SumPrice
from
SP_JJMM(:VonDatum, :BisDatum) JM
left join PAYMENTS P on (EXTRACT(YEAR from P.PAYMENT_DATE) * 100 + EXTRACT(MONTH from P.PAYMENT_DATE) = JM.JJJMM)
group BY
JM.Jahr,
JM.Monat
und hier noch die SP dazu:
SQL-Code:
create or alter procedure SP_JJMM (
ADATUM_VON date,
ADATUM_BIS date)
returns (
JAHR integer,
MONAT integer,
JJJJMM INTEGER)
as
declare variable VON integer;
declare variable BIS integer;
begin
IF (ADATUM_VON is not NULL) THEN
VON = EXTRACT(YEAR FROM ADATUM_VON) * 100 + EXTRACT(MONTH FROM ADATUM_VON);
ELSE
VON = EXTRACT(YEAR FROM CURRENT_DATE) * 100 + EXTRACT(MONTH FROM CURRENT_DATE);
IF (ADATUM_BIS is not NULL) THEN
BIS = EXTRACT(YEAR FROM ADATUM_BIS) * 100 + EXTRACT(MONTH FROM ADATUM_BIS);
ELSE
BIS = EXTRACT(YEAR FROM CURRENT_DATE) * 100 + EXTRACT(MONTH FROM CURRENT_DATE);
JAHR = NULL;
MONAT = NULL;
WHILE (VON <= BIS) DO
BEGIN
JAHR = VON / 100;
MONAT = MOD(VON, 12) +1;
JJJJMM = JAHR * 100 + MONAT;
suspend;
VON = VON +1;
END
end