Saludos...
Supongo que la solución que te propone PepCat resuelve tu necesidad, pero el problema que tienes es que no aparecen los meses sin movimientos.
Explico cómo resuelvo yo estas situaciones:
En todas las BD tengo un procedimiento almacenado tal que así:
Código SQL
[-]SET TERM ^ ;
CREATE OR ALTER PROCEDURE MBM_NUMEROS (
desde integer,
hasta integer)
returns (
numero integer)
as
declare variable i integer;
begin
i=desde;
while (i<=hasta) do
begin
NUMERO=i;
suspend;
i=i+1;
end
end^
SET TERM ; ^
Esto me permite lanzar una consulta que me devuelve únicamente una columna con cualquier rango de números que necesite...
Dias de la semana:
Código SQL
[-]select * from mbm_numeros(1,7);
Mese del año:
Código SQL
[-]select * from mbm_numeros(1,12);
A partir de aquí, imagina una tabla de facturas con una consulta que me devuelve los importes mensuales totales:
Código SQL
[-]select Extract(Month from fv.fecha) as Mes, sum(fv.imp_factura) as Total_mes
from tbl_Facturas_vta fv
where fv.fecha between '2021.01.01' and '2021.12.31'
group by mes;
Y lo que hago es un join con la tabla de números tal que así:
Código SQL
[-]select numero as Mes, Total_mes
from mbm_numeros(1,12) nu left outer join
(select Extract(Month from fecha) as Mes, sum(imp_factura) as Total_mes
from tbl_Facturas_vta
where fecha between '2021.01.01' and '2021.12.31'
group by mes) fv on(nu.numero=fv.mes) ;
De esta forma siempre aparecerán los doce meses del año, los 30 o 31 días del mes, o los 365 días del año
Siempre puedes montarte un procedimiento almacenado que te devuelva directamente los datos, pero la solución de mi tabla de números siempre me resuelve este tipo de situaciones
Un saludo a todos