Ver Mensaje Individual
  #4  
Antiguo 30-09-2021
manelb manelb is offline
Miembro
 
Registrado: mar 2017
Posts: 281
Reputación: 8
manelb Va por buen camino
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
Responder Con Cita