Ayuda con esto por favor

10/04/2004 - 16:33 por julio | Informe spam
Hola Grupo

Tengo una tabla y siguiera lo siguiente

ConsumoID Fecha ClienteID Consumo Total
1 01/01/04 1 0 0
2 01/02/04 1 75 75
3 01/03/04 1 100 25
4 01/01/04 2 0 0
5 01/02/04 2 60 60
5 01/03/04 2 80 20

Quiero tener el campo total calculado, es decir que me reste el consumo del
mes anterior del mes actual.
Aqui suponemos que iniciara en el mes 01/010/01 en '0' por lo tanto el total
es igual a cero, luego en el mes 01/02/04 el total es igual a 75 porque
75 -0 = 0, luego en la fecha 01/03/04 el total es igual a 25 ya que 100-75
%
Donde el clienteID tiene que ser igual al clienteID

Lo que este cliente consume en un mes se le factura a ese mes y lo que
consume el proximo mes es igual a ese mes menos el mes anterior y este es el
monto al cual se le facturara el mes.

Javier Loria me estuvo ayudando con esto y me envio lo siguiente:

CREATE VIEW ClienteConsumoMensual
AS
SELECT Tabla.ConsumoId
, Tabla.Fecha
, Tabla.ClienteId
, Tabla.Consumo
, Tabla.Consumo-COALESCE(Anterior.Consumo,0) AS Total
FROM Tabla
LEFT JOIN Tabla AS Anterior
ON Tabla.FechaÚTEADD(mm,1,Anterior.Fecha)
AND Tabla.ClienteID=Anterior.ClienteID


Esto funciona a la perfección, ahora estuve
asiendo prueba y veo que tienen que coincidir el mes actual con el mes
pasado en cuanto a días y mes, pero tengo un problema que si en el mes
presente se hace un insert con un día de diferencia del mes anterior no
realiza la resta, es decir resta el valor actual por cero donde debería ser
no por cero sino por el valor anterior.

Siempre el campo Consumo tendra un valor mayor Mes tras mes.
Estuve probando asiendo un select Max(consumo) por cliente y implementando
un trigger instead of insert
pero esto no me sale.

Preguntas similare

Leer las respuestas

#1 Rodriguez
12/04/2004 - 16:22 | Informe spam
Hola grupo

Quiero ver si me pueden ayudar a reparar este codigo, tengo el siguiente
codigo

Create view TotalConsumo
AS
select ConsumoID,fecha,clienteid,Energia, Energia -
isnull ((select Energia from Consumo a
where a.ConsumoID (select max(ConsumoID) from Consumo b
where b.ConsumoID < c.ConsumoID) and a.clienteid = c.clienteid),0) 'total'
from Consumo c

Este codigo funciona bien siempre y cuando el clienteId vaya en orden, pero
si el clienteID no llava el orden es decir group by no funciona

De esta manera funciona bien

ConsumoID Fecha ClienteID Consumo Total
1 01/01/04 1 100 100
2 01/02/04 1 120 20
3 01/03/04 1 150 30
4 01/01/04 2 0 0
5 01/02/04 2 60 60
5 01/03/04 2 80 20


Pero de esta manera no, lo pone de la siguiente manera

ConsumoID Fecha ClienteID Consumo Total
1 01/01/04 1 100 100
2 01/02/04 2 75 75
3 01/03/04 1 120 120
4 01/01/04 2 300 300
5 01/02/04 1 400 400
5 01/03/04 2 500 500




"julio" wrote in message
news:%
Hola Grupo

Tengo una tabla y siguiera lo siguiente

ConsumoID Fecha ClienteID Consumo Total
1 01/01/04 1 0 0
2 01/02/04 1 75 75
3 01/03/04 1 100 25
4 01/01/04 2 0 0
5 01/02/04 2 60 60
5 01/03/04 2 80 20

Quiero tener el campo total calculado, es decir que me reste el consumo


del
mes anterior del mes actual.
Aqui suponemos que iniciara en el mes 01/010/01 en '0' por lo tanto el


total
es igual a cero, luego en el mes 01/02/04 el total es igual a 75 porque
75 -0 = 0, luego en la fecha 01/03/04 el total es igual a 25 ya que 100-75
%
Donde el clienteID tiene que ser igual al clienteID

Lo que este cliente consume en un mes se le factura a ese mes y lo que
consume el proximo mes es igual a ese mes menos el mes anterior y este es


el
monto al cual se le facturara el mes.

Javier Loria me estuvo ayudando con esto y me envio lo siguiente:

CREATE VIEW ClienteConsumoMensual
AS
SELECT Tabla.ConsumoId
, Tabla.Fecha
, Tabla.ClienteId
, Tabla.Consumo
, Tabla.Consumo-COALESCE(Anterior.Consumo,0) AS Total
FROM Tabla
LEFT JOIN Tabla AS Anterior
ON Tabla.FechaÚTEADD(mm,1,Anterior.Fecha)
AND Tabla.ClienteID=Anterior.ClienteID


Esto funciona a la perfección, ahora estuve
asiendo prueba y veo que tienen que coincidir el mes actual con el mes
pasado en cuanto a días y mes, pero tengo un problema que si en el mes
presente se hace un insert con un día de diferencia del mes anterior no
realiza la resta, es decir resta el valor actual por cero donde debería


ser
no por cero sino por el valor anterior.

Siempre el campo Consumo tendra un valor mayor Mes tras mes.
Estuve probando asiendo un select Max(consumo) por cliente y implementando
un trigger instead of insert
pero esto no me sale.





Respuesta Responder a este mensaje
#2 Javier Loria
12/04/2004 - 16:51 | Informe spam
Hola Julio:
En la solucion que te envie asumi que como las fechas empezaban con 01
representaban unicamente el mes :(
Si existe la posiblidad que alguna fecha NO sea 01, pero siempre quieres
agrupar por mes. Puedes hacer esto.
==CREATE VIEW ClienteConsumoMensual
AS
SELECT Tabla.ConsumoId
, Tabla.Fecha
, Tabla.ClienteId
, Tabla.Consumo
, Tabla.Consumo-COALESCE(Anterior.Consumo,0) AS Total
FROM Tabla
LEFT JOIN Tabla AS Anterior
ON
DATEPART(Year, Tabla.Fecha)*100 + DATEPART(Month, Tabla.Fecha) DATEPART(Year, Anterior.Fecha)*100 + DATEPART(Month,
Anterior.Fecha)
AND Tabla.ClienteID=Anterior.ClienteID
Siempre y cuando SOLO exista una fecha por mes por cliente. Si existen
mas de una fecha por mes por cliente. Entonces se requiere algun criterior
para distinguir cual de las filas dentro del mes se quiere y por supuesto se
vuelve mas complejo.
Yo consideraria la posiblidad de registringir con un CHECK la tabla para
evitar que ingresen valores con fechas cuyo dia sea diferente de 01.
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
julio escribio:
Hola Grupo

Tengo una tabla y siguiera lo siguiente

ConsumoID Fecha ClienteID Consumo Total
1 01/01/04 1 0
0 2 01/02/04 1 75
75 3 01/03/04 1 100
25 4 01/01/04 2 0
0 5 01/02/04 2 60
60 5 01/03/04 2 80
20

Quiero tener el campo total calculado, es decir que me reste el
consumo del mes anterior del mes actual.
Aqui suponemos que iniciara en el mes 01/010/01 en '0' por lo tanto
el total es igual a cero, luego en el mes 01/02/04 el total es igual
a 75 porque 75 -0 = 0, luego en la fecha 01/03/04 el total es igual a
25 ya que 100-75 %
Donde el clienteID tiene que ser igual al clienteID

Lo que este cliente consume en un mes se le factura a ese mes y lo que
consume el proximo mes es igual a ese mes menos el mes anterior y
este es el monto al cual se le facturara el mes.

Javier Loria me estuvo ayudando con esto y me envio lo siguiente:

CREATE VIEW ClienteConsumoMensual
AS
SELECT Tabla.ConsumoId
, Tabla.Fecha
, Tabla.ClienteId
, Tabla.Consumo
, Tabla.Consumo-COALESCE(Anterior.Consumo,0) AS Total
FROM Tabla
LEFT JOIN Tabla AS Anterior
ON Tabla.FechaÚTEADD(mm,1,Anterior.Fecha)
AND Tabla.ClienteID=Anterior.ClienteID


Esto funciona a la perfección, ahora estuve
asiendo prueba y veo que tienen que coincidir el mes actual con el mes
pasado en cuanto a días y mes, pero tengo un problema que si en el mes
presente se hace un insert con un día de diferencia del mes anterior
no realiza la resta, es decir resta el valor actual por cero donde
debería ser no por cero sino por el valor anterior.

Siempre el campo Consumo tendra un valor mayor Mes tras mes.
Estuve probando asiendo un select Max(consumo) por cliente y
implementando un trigger instead of insert
pero esto no me sale.
Respuesta Responder a este mensaje
#3 Julio
12/04/2004 - 18:05 | Informe spam
Gracias Javier por contestar, estuve probando el codigo que me enviaste y al
parecer me repite los row varias veces.

Esto es lo que tengo

CREATE TABLE [dbo].[TAbla] (
[ConsumoID] [int] IDENTITY (1, 1) primary key,
[ClienteID] [int] NULL ,
[Consumo] [numeric] (10),
[Fecha] [datetime],
[Potencia] [numeric],
[FP] [numeric] )


insert into tabla
select 1 ,300,'20040101',1,0 union all
select 2 ,300,'20040101',1,0 union all
select 1 ,500,'20040103',1,0 union all
select 2 ,600,'20040102',1,0 union all
select 1 ,700,'20040105',1,0 union all
select 2 ,300,'20040104',1,0

CREATE VIEW ClienteConsumoMensual
AS
SELECT Tabla.ConsumoId
, Tabla.Fecha
, Tabla.ClienteId
, Tabla.Consumo
, Tabla.Consumo-COALESCE(Anterior.Consumo,0) AS Total
FROM Tabla
LEFT JOIN Tabla AS Anterior
ON
DATEPART(Year, Tabla.Fecha)*100 + DATEPART(Month, Tabla.Fecha) DATEPART(Year, Anterior.Fecha)*100 + DATEPART(Month,
Anterior.Fecha)
AND Tabla.ClienteID=Anterior.ClienteID






"Javier Loria" wrote in message
news:
Hola Julio:
En la solucion que te envie asumi que como las fechas empezaban con 01
representaban unicamente el mes :(
Si existe la posiblidad que alguna fecha NO sea 01, pero siempre


quieres
agrupar por mes. Puedes hacer esto.
==> CREATE VIEW ClienteConsumoMensual
AS
SELECT Tabla.ConsumoId
, Tabla.Fecha
, Tabla.ClienteId
, Tabla.Consumo
, Tabla.Consumo-COALESCE(Anterior.Consumo,0) AS Total
FROM Tabla
LEFT JOIN Tabla AS Anterior
ON
DATEPART(Year, Tabla.Fecha)*100 + DATEPART(Month, Tabla.Fecha) > DATEPART(Year, Anterior.Fecha)*100 + DATEPART(Month,
Anterior.Fecha)
AND Tabla.ClienteID=Anterior.ClienteID
> Siempre y cuando SOLO exista una fecha por mes por cliente. Si existen
mas de una fecha por mes por cliente. Entonces se requiere algun criterior
para distinguir cual de las filas dentro del mes se quiere y por supuesto


se
vuelve mas complejo.
Yo consideraria la posiblidad de registringir con un CHECK la tabla


para
evitar que ingresen valores con fechas cuyo dia sea diferente de 01.
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
julio escribio:
> Hola Grupo
>
> Tengo una tabla y siguiera lo siguiente
>
> ConsumoID Fecha ClienteID Consumo Total
> 1 01/01/04 1 0
> 0 2 01/02/04 1 75
> 75 3 01/03/04 1 100
> 25 4 01/01/04 2 0
> 0 5 01/02/04 2 60
> 60 5 01/03/04 2 80
> 20
>
> Quiero tener el campo total calculado, es decir que me reste el
> consumo del mes anterior del mes actual.
> Aqui suponemos que iniciara en el mes 01/010/01 en '0' por lo tanto
> el total es igual a cero, luego en el mes 01/02/04 el total es igual
> a 75 porque 75 -0 = 0, luego en la fecha 01/03/04 el total es igual a
> 25 ya que 100-75 %
> Donde el clienteID tiene que ser igual al clienteID
>
> Lo que este cliente consume en un mes se le factura a ese mes y lo que
> consume el proximo mes es igual a ese mes menos el mes anterior y
> este es el monto al cual se le facturara el mes.
>
> Javier Loria me estuvo ayudando con esto y me envio lo siguiente:
>
> CREATE VIEW ClienteConsumoMensual
> AS
> SELECT Tabla.ConsumoId
> , Tabla.Fecha
> , Tabla.ClienteId
> , Tabla.Consumo
> , Tabla.Consumo-COALESCE(Anterior.Consumo,0) AS Total
> FROM Tabla
> LEFT JOIN Tabla AS Anterior
> ON Tabla.FechaÚTEADD(mm,1,Anterior.Fecha)
> AND Tabla.ClienteID=Anterior.ClienteID
>
>
> Esto funciona a la perfección, ahora estuve
> asiendo prueba y veo que tienen que coincidir el mes actual con el mes
> pasado en cuanto a días y mes, pero tengo un problema que si en el mes
> presente se hace un insert con un día de diferencia del mes anterior
> no realiza la resta, es decir resta el valor actual por cero donde
> debería ser no por cero sino por el valor anterior.
>
> Siempre el campo Consumo tendra un valor mayor Mes tras mes.
> Estuve probando asiendo un select Max(consumo) por cliente y
> implementando un trigger instead of insert
> pero esto no me sale.


Respuesta Responder a este mensaje
#4 Javier Loria
12/04/2004 - 18:49 | Informe spam
Hola Julio:
Muchas Gracias por el DDL, hace mucha diferencia.
Asumo que en la ultima linea del INSERT el valor no puede ser 300 a
menos que permitas consumos negativos.
Asumo que la ClienteID, Fecha son la llave primaria natural de la tabla,
o sea que no hay para el mismo cliente no hay 2 filas de la misma fecha.
Asumo que los montos de consumo se acumulan por mes y empiezan en 0 cada
mes.
==CREATE VIEW ClienteConsumoMensual
AS
SELECT Tabla.ConsumoId
, Tabla.Fecha
, Tabla.ClienteId
, Tabla.Consumo-COALESCE(MAX(Anterior.Consumo),0) AS Total
FROM Tabla
LEFT JOIN Tabla AS Anterior
ON DATEPART(Year, Tabla.Fecha)*100 + DATEPART(Month, Tabla.Fecha) DATEPART(Year, Anterior.Fecha)*100 + DATEPART(Month,Anterior.Fecha)
AND Tabla.ClienteID=Anterior.ClienteID
AND Tabla.Fecha>Anterior.Fecha
GROUP BY Tabla.ConsumoId
, Tabla.Fecha
, Tabla.ClienteId
, Tabla.Consumo
Espero haber entendido y que los supuestos sean correctos.

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Julio escribio:
Gracias Javier por contestar, estuve probando el codigo que me
enviaste y al parecer me repite los row varias veces.

Esto es lo que tengo

CREATE TABLE [dbo].[TAbla] (
[ConsumoID] [int] IDENTITY (1, 1) primary key,
[ClienteID] [int] NULL ,
[Consumo] [numeric] (10),
[Fecha] [datetime],
[Potencia] [numeric],
[FP] [numeric] )


insert into tabla
select 1 ,300,'20040101',1,0 union all
select 2 ,300,'20040101',1,0 union all
select 1 ,500,'20040103',1,0 union all
select 2 ,600,'20040102',1,0 union all
select 1 ,700,'20040105',1,0 union all
select 2 ,300,'20040104',1,0

CREATE VIEW ClienteConsumoMensual
AS
SELECT Tabla.ConsumoId
, Tabla.Fecha
, Tabla.ClienteId
, Tabla.Consumo
, Tabla.Consumo-COALESCE(Anterior.Consumo,0) AS Total
FROM Tabla
LEFT JOIN Tabla AS Anterior
ON
DATEPART(Year, Tabla.Fecha)*100 + DATEPART(Month, Tabla.Fecha) > DATEPART(Year, Anterior.Fecha)*100 + DATEPART(Month,
Anterior.Fecha)
AND Tabla.ClienteID=Anterior.ClienteID






"Javier Loria" wrote in message
news:
Hola Julio:
En la solucion que te envie asumi que como las fechas empezaban
con 01 representaban unicamente el mes :(
Si existe la posiblidad que alguna fecha NO sea 01, pero siempre
quieres agrupar por mes. Puedes hacer esto.
==>> CREATE VIEW ClienteConsumoMensual
AS
SELECT Tabla.ConsumoId
, Tabla.Fecha
, Tabla.ClienteId
, Tabla.Consumo
, Tabla.Consumo-COALESCE(Anterior.Consumo,0) AS
Total FROM Tabla
LEFT JOIN Tabla AS Anterior
ON
DATEPART(Year, Tabla.Fecha)*100 + DATEPART(Month, Tabla.Fecha) >> DATEPART(Year, Anterior.Fecha)*100 + DATEPART(Month,
Anterior.Fecha)
AND Tabla.ClienteID=Anterior.ClienteID
>> Siempre y cuando SOLO exista una fecha por mes por cliente. Si
existen mas de una fecha por mes por cliente. Entonces se requiere
algun criterior para distinguir cual de las filas dentro del mes se
quiere y por supuesto se vuelve mas complejo.
Yo consideraria la posiblidad de registringir con un CHECK la
tabla para evitar que ingresen valores con fechas cuyo dia sea
diferente de 01. Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
julio escribio:
Hola Grupo

Tengo una tabla y siguiera lo siguiente

ConsumoID Fecha ClienteID Consumo Total
1 01/01/04 1 0
0 2 01/02/04 1 75
75 3 01/03/04 1 100
25 4 01/01/04 2 0
0 5 01/02/04 2 60
60 5 01/03/04 2 80
20

Quiero tener el campo total calculado, es decir que me reste el
consumo del mes anterior del mes actual.
Aqui suponemos que iniciara en el mes 01/010/01 en '0' por lo tanto
el total es igual a cero, luego en el mes 01/02/04 el total es
igual
a 75 porque 75 -0 = 0, luego en la fecha 01/03/04 el total es igual
a 25 ya que 100-75 %
Donde el clienteID tiene que ser igual al clienteID

Lo que este cliente consume en un mes se le factura a ese mes y lo
que consume el proximo mes es igual a ese mes menos el mes anterior
y
este es el monto al cual se le facturara el mes.

Javier Loria me estuvo ayudando con esto y me envio lo siguiente:

CREATE VIEW ClienteConsumoMensual
AS
SELECT Tabla.ConsumoId
, Tabla.Fecha
, Tabla.ClienteId
, Tabla.Consumo
, Tabla.Consumo-COALESCE(Anterior.Consumo,0) AS
Total FROM Tabla
LEFT JOIN Tabla AS Anterior
ON Tabla.FechaÚTEADD(mm,1,Anterior.Fecha)
AND Tabla.ClienteID=Anterior.ClienteID


Esto funciona a la perfección, ahora estuve
asiendo prueba y veo que tienen que coincidir el mes actual con el
mes pasado en cuanto a días y mes, pero tengo un problema que si en
el mes presente se hace un insert con un día de diferencia del mes
anterior
no realiza la resta, es decir resta el valor actual por cero donde
debería ser no por cero sino por el valor anterior.

Siempre el campo Consumo tendra un valor mayor Mes tras mes.
Estuve probando asiendo un select Max(consumo) por cliente y
implementando un trigger instead of insert
pero esto no me sale.
Respuesta Responder a este mensaje
#5 Julio
12/04/2004 - 19:56 | Informe spam
Mucha gracias Javier por tu aporte, lo estoy probando y todo va bien por el
momento

Gracias de nuevo


"Javier Loria" wrote in message
news:O$
Hola Julio:
Muchas Gracias por el DDL, hace mucha diferencia.
Asumo que en la ultima linea del INSERT el valor no puede ser 300 a
menos que permitas consumos negativos.
Asumo que la ClienteID, Fecha son la llave primaria natural de la


tabla,
o sea que no hay para el mismo cliente no hay 2 filas de la misma fecha.
Asumo que los montos de consumo se acumulan por mes y empiezan en 0


cada
mes.
==> CREATE VIEW ClienteConsumoMensual
AS
SELECT Tabla.ConsumoId
, Tabla.Fecha
, Tabla.ClienteId
, Tabla.Consumo-COALESCE(MAX(Anterior.Consumo),0) AS Total
FROM Tabla
LEFT JOIN Tabla AS Anterior
ON DATEPART(Year, Tabla.Fecha)*100 + DATEPART(Month, Tabla.Fecha) > DATEPART(Year, Anterior.Fecha)*100 + DATEPART(Month,Anterior.Fecha)
AND Tabla.ClienteID=Anterior.ClienteID
AND Tabla.Fecha>Anterior.Fecha
GROUP BY Tabla.ConsumoId
, Tabla.Fecha
, Tabla.ClienteId
, Tabla.Consumo
> Espero haber entendido y que los supuestos sean correctos.

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Julio escribio:
> Gracias Javier por contestar, estuve probando el codigo que me
> enviaste y al parecer me repite los row varias veces.
>
> Esto es lo que tengo
>
> CREATE TABLE [dbo].[TAbla] (
> [ConsumoID] [int] IDENTITY (1, 1) primary key,
> [ClienteID] [int] NULL ,
> [Consumo] [numeric] (10),
> [Fecha] [datetime],
> [Potencia] [numeric],
> [FP] [numeric] )
>
>
> insert into tabla
> select 1 ,300,'20040101',1,0 union all
> select 2 ,300,'20040101',1,0 union all
> select 1 ,500,'20040103',1,0 union all
> select 2 ,600,'20040102',1,0 union all
> select 1 ,700,'20040105',1,0 union all
> select 2 ,300,'20040104',1,0
>
> CREATE VIEW ClienteConsumoMensual
> AS
> SELECT Tabla.ConsumoId
> , Tabla.Fecha
> , Tabla.ClienteId
> , Tabla.Consumo
> , Tabla.Consumo-COALESCE(Anterior.Consumo,0) AS Total
> FROM Tabla
> LEFT JOIN Tabla AS Anterior
> ON
> DATEPART(Year, Tabla.Fecha)*100 + DATEPART(Month, Tabla.Fecha) > > DATEPART(Year, Anterior.Fecha)*100 + DATEPART(Month,
> Anterior.Fecha)
> AND Tabla.ClienteID=Anterior.ClienteID
>
>
>
>
>
>
> "Javier Loria" wrote in message
> news:
>> Hola Julio:
>> En la solucion que te envie asumi que como las fechas empezaban
>> con 01 representaban unicamente el mes :(
>> Si existe la posiblidad que alguna fecha NO sea 01, pero siempre
>> quieres agrupar por mes. Puedes hacer esto.
>> ==> >> CREATE VIEW ClienteConsumoMensual
>> AS
>> SELECT Tabla.ConsumoId
>> , Tabla.Fecha
>> , Tabla.ClienteId
>> , Tabla.Consumo
>> , Tabla.Consumo-COALESCE(Anterior.Consumo,0) AS
>> Total FROM Tabla
>> LEFT JOIN Tabla AS Anterior
>> ON
>> DATEPART(Year, Tabla.Fecha)*100 + DATEPART(Month, Tabla.Fecha) > >> DATEPART(Year, Anterior.Fecha)*100 + DATEPART(Month,
>> Anterior.Fecha)
>> AND Tabla.ClienteID=Anterior.ClienteID
>> > >> Siempre y cuando SOLO exista una fecha por mes por cliente. Si
>> existen mas de una fecha por mes por cliente. Entonces se requiere
>> algun criterior para distinguir cual de las filas dentro del mes se
>> quiere y por supuesto se vuelve mas complejo.
>> Yo consideraria la posiblidad de registringir con un CHECK la
>> tabla para evitar que ingresen valores con fechas cuyo dia sea
>> diferente de 01. Saludos,
>>
>> Javier Loria
>> Costa Rica
>> Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
>> que pueda ser copiado y pegado al Query Analizer.
>> La version de SQL y Service Pack tambien ayuda.
>> julio escribio:
>>> Hola Grupo
>>>
>>> Tengo una tabla y siguiera lo siguiente
>>>
>>> ConsumoID Fecha ClienteID Consumo Total
>>> 1 01/01/04 1 0
>>> 0 2 01/02/04 1 75
>>> 75 3 01/03/04 1 100
>>> 25 4 01/01/04 2 0
>>> 0 5 01/02/04 2 60
>>> 60 5 01/03/04 2 80
>>> 20
>>>
>>> Quiero tener el campo total calculado, es decir que me reste el
>>> consumo del mes anterior del mes actual.
>>> Aqui suponemos que iniciara en el mes 01/010/01 en '0' por lo tanto
>>> el total es igual a cero, luego en el mes 01/02/04 el total es
>>> igual
>>> a 75 porque 75 -0 = 0, luego en la fecha 01/03/04 el total es igual
>>> a 25 ya que 100-75 %
>>> Donde el clienteID tiene que ser igual al clienteID
>>>
>>> Lo que este cliente consume en un mes se le factura a ese mes y lo
>>> que consume el proximo mes es igual a ese mes menos el mes anterior
>>> y
>>> este es el monto al cual se le facturara el mes.
>>>
>>> Javier Loria me estuvo ayudando con esto y me envio lo siguiente:
>>>
>>> CREATE VIEW ClienteConsumoMensual
>>> AS
>>> SELECT Tabla.ConsumoId
>>> , Tabla.Fecha
>>> , Tabla.ClienteId
>>> , Tabla.Consumo
>>> , Tabla.Consumo-COALESCE(Anterior.Consumo,0) AS
>>> Total FROM Tabla
>>> LEFT JOIN Tabla AS Anterior
>>> ON Tabla.FechaÚTEADD(mm,1,Anterior.Fecha)
>>> AND Tabla.ClienteID=Anterior.ClienteID
>>>
>>>
>>> Esto funciona a la perfección, ahora estuve
>>> asiendo prueba y veo que tienen que coincidir el mes actual con el
>>> mes pasado en cuanto a días y mes, pero tengo un problema que si en
>>> el mes presente se hace un insert con un día de diferencia del mes
>>> anterior
>>> no realiza la resta, es decir resta el valor actual por cero donde
>>> debería ser no por cero sino por el valor anterior.
>>>
>>> Siempre el campo Consumo tendra un valor mayor Mes tras mes.
>>> Estuve probando asiendo un select Max(consumo) por cliente y
>>> implementando un trigger instead of insert
>>> pero esto no me sale.


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida