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

#6 Julio
12/04/2004 - 23:30 | Informe spam
Hola Javier, es posible en esta vista incluir el campo que dice Potencia,
tomando en cuenta que este campo siempre sera el maximo que se registre sin
importar el mes tomando en cuenta el clienteID , y el campo que dice fp si
es menor que 0.9 que conga el valor de la resta de ese valor menos 0.9 y si
es mayor que 0.9 que se mantenga el valor del campo.

Ejemplo

En la vista el campo FP = IF FT < 0.9 entonces FP = FT - 0.9 Pero si FT >
0.9 FP = FP






"Julio" wrote in message
news:
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
#7 Javier Loria
13/04/2004 - 13:43 | Informe spam
Hola Julio:
Si. me parece posible con un case:
, CASE WHEN Tabla.FT<0.9 THEN FT-.09
ELSE FT END AS FP
Esto debe agregarse tanto a la lista de columnas del SELECT como a las
del GROUP BY.
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 Javier, es posible en esta vista incluir el campo que dice
Potencia, tomando en cuenta que este campo siempre sera el maximo que
se registre sin importar el mes tomando en cuenta el clienteID , y el
campo que dice fp si es menor que 0.9 que conga el valor de la resta
de ese valor menos 0.9 y si es mayor que 0.9 que se mantenga el valor
del campo.

Ejemplo

En la vista el campo FP = IF FT < 0.9 entonces FP = FT - 0.9 Pero si
FT >
0.9 FP = FP






"Julio" wrote in message
news:
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
#8 Julio
13/04/2004 - 15:16 | Informe spam
Hola Javier, lo tengo agregado de esta manera, el campo en la tabla se llama
es FP

CREATE VIEW ClienteConsumoMensual
AS
SELECT Tabla.ConsumoId
, Tabla.Fecha
, Tabla.ClienteId
, Tabla.Consumo-COALESCE(MAX(Anterior.Consumo),0) AS Total
, CASE WHEN Tabla.Fp<0.9 THEN Fp-.09
ELSE Fp END AS FP
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
, tabla.fp

Me dice

Server: Msg 209, Level 16, State 1, Line 1
Ambiguous column name 'FP'.
Server: Msg 209, Level 16, State 1, Line 1
Ambiguous column name 'FP'.









"Javier Loria" wrote in message
news:
Hola Julio:
Si. me parece posible con un case:
> , CASE WHEN Tabla.FT<0.9 THEN FT-.09
ELSE FT END AS FP
> Esto debe agregarse tanto a la lista de columnas del SELECT como a las
del GROUP BY.
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 Javier, es posible en esta vista incluir el campo que dice
> Potencia, tomando en cuenta que este campo siempre sera el maximo que
> se registre sin importar el mes tomando en cuenta el clienteID , y el
> campo que dice fp si es menor que 0.9 que conga el valor de la resta
> de ese valor menos 0.9 y si es mayor que 0.9 que se mantenga el valor
> del campo.
>
> Ejemplo
>
> En la vista el campo FP = IF FT < 0.9 entonces FP = FT - 0.9 Pero si
> FT >
> 0.9 FP = FP
>
>
>
>
>
>
> "Julio" wrote in message
> news:
>> 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
#9 Maximiliano D. A.
13/04/2004 - 15:21 | Informe spam
Perdon que me meta no!! pero eso te lo dice porque no le estas poniendo el
nombre de la tabla antes del campo y como puede haber mas de un FP entonces
no sabe Sql a cual haces referencia.

Yo por norma, siempre poongo el nombre de la tabla seguido del campo!! sea
una consulta de 2 campos y una sola tabla o una consulta como la tuya!!

Bye


Salu2
Maxi

Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET

MSN:
Nunca consideres el estudio como una obligación sino como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"Julio" escribió en el mensaje
news:
Hola Javier, lo tengo agregado de esta manera, el campo en la tabla se


llama
es FP

CREATE VIEW ClienteConsumoMensual
AS
SELECT Tabla.ConsumoId
, Tabla.Fecha
, Tabla.ClienteId
, Tabla.Consumo-COALESCE(MAX(Anterior.Consumo),0) AS Total
, CASE WHEN Tabla.Fp<0.9 THEN Fp-.09
ELSE Fp END AS FP
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
, tabla.fp

Me dice

Server: Msg 209, Level 16, State 1, Line 1
Ambiguous column name 'FP'.
Server: Msg 209, Level 16, State 1, Line 1
Ambiguous column name 'FP'.









"Javier Loria" wrote in message
news:
> Hola Julio:
> Si. me parece posible con un case:
> > > , CASE WHEN Tabla.FT<0.9 THEN FT-.09
> ELSE FT END AS FP
> > > Esto debe agregarse tanto a la lista de columnas del SELECT como a


las
> del GROUP BY.
> 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 Javier, es posible en esta vista incluir el campo que dice
> > Potencia, tomando en cuenta que este campo siempre sera el maximo que
> > se registre sin importar el mes tomando en cuenta el clienteID , y el
> > campo que dice fp si es menor que 0.9 que conga el valor de la resta
> > de ese valor menos 0.9 y si es mayor que 0.9 que se mantenga el valor
> > del campo.
> >
> > Ejemplo
> >
> > En la vista el campo FP = IF FT < 0.9 entonces FP = FT - 0.9 Pero si
> > FT >
> > 0.9 FP = FP
> >
> >
> >
> >
> >
> >
> > "Julio" wrote in message
> > news:
> >> 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.
>
>







Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.655 / Virus Database: 420 - Release Date: 08/04/2004
Respuesta Responder a este mensaje
#10 Julio
13/04/2004 - 15:57 | Informe spam
Ok, Gracias Max
"Maximiliano D. A." wrote in message
news:%
Perdon que me meta no!! pero eso te lo dice porque no le estas poniendo el
nombre de la tabla antes del campo y como puede haber mas de un FP


entonces
no sabe Sql a cual haces referencia.

Yo por norma, siempre poongo el nombre de la tabla seguido del campo!! sea
una consulta de 2 campos y una sola tabla o una consulta como la tuya!!

Bye


Salu2
Maxi

Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET

MSN:
Nunca consideres el estudio como una obligación sino como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"Julio" escribió en el mensaje
news:
> Hola Javier, lo tengo agregado de esta manera, el campo en la tabla se
llama
> es FP
>
> CREATE VIEW ClienteConsumoMensual
> AS
> SELECT Tabla.ConsumoId
> , Tabla.Fecha
> , Tabla.ClienteId
> , Tabla.Consumo-COALESCE(MAX(Anterior.Consumo),0) AS Total
> , CASE WHEN Tabla.Fp<0.9 THEN Fp-.09
> ELSE Fp END AS FP
> 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
> , tabla.fp
>
> Me dice
>
> Server: Msg 209, Level 16, State 1, Line 1
> Ambiguous column name 'FP'.
> Server: Msg 209, Level 16, State 1, Line 1
> Ambiguous column name 'FP'.
>
>
>
>
>
>
>
>
>
> "Javier Loria" wrote in message
> news:
> > Hola Julio:
> > Si. me parece posible con un case:
> > > > > , CASE WHEN Tabla.FT<0.9 THEN FT-.09
> > ELSE FT END AS FP
> > > > > Esto debe agregarse tanto a la lista de columnas del SELECT como a
las
> > del GROUP BY.
> > 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 Javier, es posible en esta vista incluir el campo que dice
> > > Potencia, tomando en cuenta que este campo siempre sera el maximo


que
> > > se registre sin importar el mes tomando en cuenta el clienteID , y


el
> > > campo que dice fp si es menor que 0.9 que conga el valor de la


resta
> > > de ese valor menos 0.9 y si es mayor que 0.9 que se mantenga el


valor
> > > del campo.
> > >
> > > Ejemplo
> > >
> > > En la vista el campo FP = IF FT < 0.9 entonces FP = FT - 0.9 Pero si
> > > FT >
> > > 0.9 FP = FP
> > >
> > >
> > >
> > >
> > >
> > >
> > > "Julio" wrote in message
> > > news:
> > >> 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.
> >
> >
>
>



Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.655 / Virus Database: 420 - Release Date: 08/04/2004


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida