Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Ayuda con consulta por mes (https://www.clubdelphi.com/foros/showthread.php?t=85395)

Roger1978 12-03-2014 15:08:19

Ayuda con consulta por mes
 
Saludos, Me dirijo a Uds en esta oportunidad a ver si me alludan en esta consulta que no me arroja los resultados esperados.

Estoy manejando informacion probeniente de un router y quiero mostrar el consumo de los usuarios.
Dicho router maneja un campo BytesIn el cual siempre va incrementando y este campo lo estoy guardando en una tabla de la siguiente manera:

Código:

CREATE TABLE CONSUMO (
    COD      INTEGER NOT NULL,
    NOMBRE  VARCHAR(20),
    BYTESIN  INTEGER,
    FECHA    DATE
);

COD    NOMBRE    BYTESIN      FECHA
3    roger    20    09/03/2014
4    roger    30    10/03/2014
5    Pedro    100    10/03/2014
6    roger    10    11/02/2014
7    roger    40    10/03/2014
8    roger    50    11/04/2014

Hasta ai todo bien, el problema que tengo es para yo hacer la consulta por mes de determinado usuario,

Por Ejemplo para el usuario roger quisiera el siguiente resultado
Código:

NOMBRE    MES    ANIO    MAXIMO    TOTAL
roger    2    2014    10    10
roger    3    2014    40    30
roger    4    2014    50    10

Con la siguiente consulta me devuelve esto:
Código:

Select
NOMBRE,
extract(MONTH from fecha) As Mes,
EXTRACT(YEAR FROM FECHA) As Anio,
Max(BYTESIN)As Maximo,
(Sum(BytesIn)-Max(BYTESIN)) as Total

from consumo
Where Nombre='roger'
group by Nombre,extract(MONTH from fecha),EXTRACT(YEAR FROM FECHA)

Me devuelve esto:
Código:

NOMBRE    MES    ANIO    MAXIMO    TOTAL
roger    2    2014    10    0
roger    3    2014    40    50
roger    4    2014    50    0

y el resultado que quiero es 10 en febrero, 30 en marzo y 10 en abril

a simple vista veo que deberia restarse el mes actual menos el mes anterior, pero no se como se haria.

cualquier ayuda es bienvenida, gracias

cloayza 12-03-2014 15:55:34

Podrías usar un procedimiento almacenado...

Te propongo esta alternativa:
Código SQL [-]
create or alter procedure Router (
    Usuario as Varchar(20)) 
returns(
  Nombre as varchar(20),
  Mes as integer,
  Anio as integer,
  Maximo as integer,
  Total as integer)
as
declare variable MaxAnterior integer;
begin
    MaxAnterior=0;
  FOR Select
    Nombre,
    Extract(Month from Fecha) As Mes,
    Extract(Year From Fecha) As Anio,
    Max(BytesIn) As Maximo
  From Consumo
  Where Nombre=:Usuario
    Group By Nombre, Extract(Month From Fecha), Extract(Year From Fecha)
  Into :Nombre, :Mes, :Anio, :Maximo
  do
  begin
       Total=Maximo - MaxAnterior;
     MaxAnterior=Maximo;
     
       suspend; 
  end
end

Este procedimiento recibe un parametro que es Usuario

Para usar este puedes hacerlo desde una consulta de la siguiente manera:

Código SQL [-]
Select * From Router('roger')

No lo he probado, así que es posible que tenga errores. Me cuentas como va...

Saludos cordiales

Roger1978 12-03-2014 16:52:43

perfecto me funsiono bien.. gracias cloayza


La franja horaria es GMT +2. Ahora son las 23:40:50.

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