Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Contar registros por mes (https://www.clubdelphi.com/foros/showthread.php?t=95413)

Joser 30-09-2021 00:17:22

Contar registros por mes
 
Buenas tardes, tengo una consulta en Firebird 2.5 que cuenta los registros de una tabla y los agrupa por mes (campo Fecha= date), paso por parámetros (mes y año) pero me gustaría que lo hiciera de una sola vez.
Que pudiera quedar algo así:

Enero - 10
Febrero - 20
Marzo - 0 ( aquellos que no tienen valor asignarle 0)
...
...
...
Diciembre - 8

Desde ya muchas gracias.

PepCat 30-09-2021 09:01:06

con SQL Server seria algo así:

Código SQL [-]
SELECT Año=Year(Fecha), Mes=Month(Fecha), Contador=Count(*)
FROM "Tabla"
GROUP BY Year(Fecha), Month(Fecha)
ORDER BY Year(Fecha), Month(Fecha)

Casimiro Notevi 30-09-2021 10:16:31

Cita:

Empezado por Joser (Mensaje 543217)
Buenas tardes, tengo una consulta en Firebird 2.5 que cuenta los registros de una tabla y los agrupa por mes (campo Fecha= date), paso por parámetros (mes y año) pero me gustaría que lo hiciera de una sola vez.
Que pudiera quedar algo así:
Enero - 10
Febrero - 20
Marzo - 0 ( aquellos que no tienen valor asignarle 0)
...
...
...
Diciembre - 8
Desde ya muchas gracias.

https://www.clubdelphi.com/foros/showthread.php?t=93348

manelb 30-09-2021 15:34:08

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

Joser 01-10-2021 14:30:49

Muchas gracias por sus respuestas; manelb tu código me dio los resultados esperados y de hecho eh podido adaptarlo en otros pedidos.
Saludos.:)


La franja horaria es GMT +2. Ahora son las 17:53:32.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi