Ayuda

23/08/2004 - 18:10 por Julio | Informe spam
Hola grupo

Tengo un problema con algo aqui y quisiera ver si me pueden dar una mano con
esto.

Tengo una tabla llamada Consumo la cual es alimentada por un DTS que
introduce todos los datos en ellas, tengo un caso y es el siguiente.
Cada vez que se haga un insert en la tabla consumo el campo que dice
Potencia de la tabla Consumo sera igual al average de las dos potencia mas
alta durante los ultimos 12 meses que han pasado en el caso que esta sean
mayor que la potencia que se inserto, en caso de ser menor se queda la
potencia que se inserto.

entonces en la tabla consumo se hace todo el insert sin hacer ninguna
comparacion es decir el campo potencia se inserta tal como viene, luego creo
una vista llamada ConsumoAP para hacer los calculos.

Para que se pueda entende mejor este proyecto es para facturar la energia
electrica consumida por un usuario,como ya saben todos los meses se le cobra
lo que consumieron y si la potencia que consumieron es mayor que las dos mas
alta en los ultimos doces meses entonces se le cobra esa, de lo contario se
le cobraria el average.

Al principio el campo Potencia se tenia que extraer la maxima que asi es que
estas esta vista.


SELECT dbo.Consumo.ConsumoID, dbo.Consumo.Fecha, dbo.Consumo.ClienteID,
dbo.Consumo.Mes, dbo.Consumo.Año, dbo.Consumo.Reactiva,
dbo.Consumo.Energia, MAX(C2.Fecha) AS
FechaConsumoAnterior,
(SELECT MAX(Potencia)
<-Esta parte es la que quiero sustituir por el
average
FROM Consumo C2
WHERE C2.Clienteid = Consumo.ClienteId) AS
Max_Potencia,
(SELECT MAX(Potencia_Punta)
FROM Consumo C2
WHERE C2.Clienteid = Consumo.ClienteId) AS
Max_PotenciaPunta
FROM dbo.Consumo LEFT OUTER JOIN
dbo.Consumo C2 ON dbo.Consumo.ClienteID = C2.ClienteID
AND dbo.Consumo.Fecha > C2.Fecha
GROUP BY dbo.Consumo.ConsumoID, dbo.Consumo.Fecha, dbo.Consumo.ClienteID,
dbo.Consumo.Mes, dbo.Consumo.Año, dbo.Consumo.Reactiva,
dbo.Consumo.Energia




Vista de Consumo


CREATE TABLE [dbo].[Consumo] (
[ConsumoID] [int] IDENTITY (1, 1) NOT NULL ,
[ClienteID] [int] NOT NULL ,
[Fecha] [datetime] NOT NULL ,
[Energia] [decimal](18, 2) NULL ,
[Reactiva] [decimal](18, 2) NULL ,
[Potencia] [decimal](18, 2) NULL ,
[Potencia_punta] [decimal](18, 2) NULL ,
[Mes] AS (case (datepart(month,[fecha])) when '01' then 'Enero' when '02'
then 'Febrero' when '03' then 'Marzo' when '04' then 'Abril' when '05' then
'Mayo' when '06' then 'Junio' when '07' then 'Julio' when '08' then 'Agosto'
when '09' then 'Septiembre' when '10' then 'Octubre' when '11' then
'Noviembre' when '12' then 'Diciembre' end) ,
[Año] AS (datename(year,[fecha])) ,
[FechaInsertacion] [datetime] NULL ,
[Usuario] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
) ON [PRIMARY]

Preguntas similare

Leer las respuestas

#6 Julio
24/08/2004 - 18:39 | Informe spam
Saludos, en cuando a los del top 12 solo hacia referencia a esto pero no es
que lo tengo implementado.
Estoy tratando de ajustar el codigo y todavia no lo logro. Con la nueva
actualizacion que me dijiste en la cual se incluia el Between me trae el
resultado en NULL
En cuanto a la fecha de insertacion es solo para llevar una referencia
cuando se corrio el DTS.

Asi quedo el codigo que me dijiste.

DECLARE @fecha datetime
SET @fecha = '20030823'

SELECT Consumo.Fecha, Consumo.Cliente,
Promedio = AVG(C2.Potencia)
FROM Consumo
LEFT JOIN
(SELECT TOP 2 Cliente, Potencia
FROM Consumo
WHERE fecha BETWEEN dateadd(yy, -1, @fecha) AND dateadd(dd, -1, @fecha)
ORDER BY Potencia DESC) C2
ON C2.Cliente = Consumo.Cliente
WHERE Consumo.Fecha >= @fecha
GROUP BY Consumo.Fecha, Consumo.Cliente

UPDATE Consumo
SET potencia = CASE WHEN Potencia < Promedio THEN Promedio END
FROM
(SELECT Cliente, Promedio = AVG(C2.Potencia)
FROM
(SELECT TOP 2 Cliente, Potencia
FROM Consumo
WHERE Fecha BETWEEN dateadd(yy, -1, @fecha) AND dateadd(dd, -1, @fecha)
ORDER BY Potencia DESC) C2
GROUP BY Cliente) C3
WHERE Fecha >= @fecha
AND C3.Cliente = Consumo.Cliente







"Liliana Sorrentino" wrote in message
news:e5$
En mi propuesta uso la fecha por parámetro entre otras cosas para evitar


una
subconsulta más para tomar los últimos 12.
Por ejemplo:
Si ayer agregaste la última lectura de cada cliente a la tabla, tendrás


que
tomar las 12 lecturas ANTERIORES a la fecha de ayer.
Veo que hay una "fecha de insertación", e imagino que se actualizará
justamente con 2004/08/23.
El query que te propongo toma las dos mayores potencias desde ayer hasta


un
año antes, o sea 2003/08/23, y ahora que lo veo, hay un error en el


código.
Donde dice:
WHERE Fecha > dateadd(yy, -1, @fecha)
debe decir
WHERE Fecha BETWEEN dateadd(yy, -1, @fecha) AND dateadd(dd, -1, @fecha)
esto es para que no tome la última lectura.

Para integrarlo a tu código necesitaría que nos muestres el UPDATE, yo no



si no estaré viendo algún mensaje tuyo, pero no encuentro el TOP 12 al que
hacés mención.
En mi propuesta no hay vista, es solo el UPDATE leyendo y actualizando


sobre
la misma tabla, ¿probaste lo que te envié con mis ejemplos? ¿funciona como
necesitás?

"Julio" escribió en el mensaje
news:
> Hola Liliana, Lo de la fecha no lo tenia contenplado ya que no


necesitaba
de
> esto, lo que pensaba era hacer un select top 12 por usuario y crear una
> vista con esto para luego trabajar con ella.
>
> Nota: El usuario solo tendra un solo consumo por mes por eso puse el
select
> top 12 .
>
> Ya entiendo lo que a hecho en todo el query que me enviaste pero no he
> podido integrarlo al codigo mio que fueron las dos tablas que envie para
> poder salir de esto que no me deja tranquilo.
>
> Como te decia lo que sucede es que antes solo se queria la maxima


potencia
y
> ahora tiene que ser una relacion de las dos mas grandes en los ultimos


12
> meses y compararlo con la que se inserto para ver cual se mantendra.
>
> Si puede ayudarme a integrarlo al codigo mio te lo agradecere.
>
> Gracias.
>
>
>
>
>
> "Liliana Sorrentino" wrote in message
> news:
> > Julio,
> > Creo que lo que te mandé hace eso justamente, como comprenderás, no es
> fácil
> > probar lo desconocido, por eso te mandé todo un juego para que las
pruebas
> > las hagas vos y nos digas en qué no funciona.
> > Te explico lo que hace el UPDATE, y por supuesto puede haber mejores
> formas:
> >
> > manejás así.


el
> > promedio calculado, toma el promedio
> > UPDATE Consumo
> > SET potencia = CASE WHEN Potencia < Promedio THEN Promedio END
> > FROM
> > - calcula el promedio de las potencias seleccionadas para cada
cliente
> > (SELECT Cliente, Promedio = AVG(C2.Potencia)
> > FROM
> > - toma las dos mayores potencias por c/cliente cuando la fecha está
> > dentro del último año según parámetro
> > (SELECT TOP 2 Cliente, Potencia
> > FROM Consumo
> > WHERE Fecha > dateadd(yy, -1, @fecha)
> > ORDER BY Potencia DESC) C2
> > GROUP BY Cliente) C3
> > WHERE Fecha >= @fecha
> > AND C3.Cliente = Consumo.Cliente
> >
> > Saludos... Liliana.
> >
> >
> > "Julio" escribió en el mensaje
> > news:
> > > Gracias por responder, yo tengo creado el sistema completo lo que
> necesito
> > > es sustituir la parte que dice Max(Potencia) por el Query que me
> devuelva
> > el
> > > promedio o lo que se inserto en ese momento, es decir el que sea
mayor.
> > >
> > > Si el promedio es mayor que se mantenga el promedio y si lo que se
> inserto
> > > es mayor que mantenga el valor que se inserto.
> > >
> > > El codigo que me envias lo estuve observando pero hay sierta cosas


que
> no
> > > entiendo en el query.
> > >
> > >
> > >
> > >
> > > "Liliana Sorrentino" wrote in


message
> > > news:OlRGB%
> > > > Hola Julio,
> > > > En una versión MUY simplificada, fijate si es algo así lo que
> necesitás.
> > > > Liliana.
> > > >
> > > > CREATE TABLE consumo
> > > > (cliente smallint,
> > > > fecha datetime,
> > > > potencia smallint)
> > > > INSERT consumo SELECT 1, '20030823', 25000
> > > > INSERT consumo SELECT 1, '20031020', 1
> > > > INSERT consumo SELECT 1, '20031120', 10
> > > > INSERT consumo SELECT 1, '20031220', 100
> > > > INSERT consumo SELECT 1, '20040120', 1000
> > > > INSERT consumo SELECT 1, '20040220', 10000
> > > > INSERT consumo SELECT 1, '20040320', 20000
> > > > INSERT consumo SELECT 1, '20040823', 200
> > > >
> > > > create index consumo on consumo (cliente, fecha)
> > > > create index consumo_f on consumo (fecha, cliente)
> > > >
> > > > SELECT * FROM consumo
> > > >
> > > > DECLARE @fecha datetime
> > > > SET @fecha = '20040823'
> > > >
> > > > SELECT Consumo.Fecha, Consumo.Cliente,
> > > > Promedio = AVG(C2.Potencia)
> > > > FROM Consumo
> > > > LEFT JOIN
> > > > (SELECT TOP 2 Cliente, Potencia
> > > > FROM Consumo
> > > > WHERE Fecha > dateadd(yy, -1, @fecha)
> > > > ORDER BY Potencia DESC) C2
> > > > ON C2.Cliente = Consumo.Cliente
> > > > WHERE Consumo.Fecha >= @fecha
> > > > GROUP BY Consumo.Fecha, Consumo.Cliente
> > > >
> > > > UPDATE Consumo
> > > > SET potencia = CASE WHEN Potencia < Promedio THEN Promedio END
> > > > FROM
> > > > (SELECT Cliente, Promedio = AVG(C2.Potencia)
> > > > FROM
> > > > (SELECT TOP 2 Cliente, Potencia
> > > > FROM Consumo
> > > > WHERE Fecha > dateadd(yy, -1, @fecha)
> > > > ORDER BY Potencia DESC) C2
> > > > GROUP BY Cliente) C3
> > > > WHERE Fecha >= @fecha
> > > > AND C3.Cliente = Consumo.Cliente
> > > >
> > > > SELECT * FROM consumo
> > > >
> > > >
> > > >
> > > > "Julio" escribió en el mensaje
> > > > news:
> > > > > Hola grupo
> > > > >
> > > > > Tengo un problema con algo aqui y quisiera ver si me pueden dar
una
> > mano
> > > > con
> > > > > esto.
> > > > >
> > > > > Tengo una tabla llamada Consumo la cual es alimentada por un DTS
que
> > > > > introduce todos los datos en ellas, tengo un caso y es el
siguiente.
> > > > > Cada vez que se haga un insert en la tabla consumo el campo que
dice
> > > > > Potencia de la tabla Consumo sera igual al average de las dos
> potencia
> > > mas
> > > > > alta durante los ultimos 12 meses que han pasado en el caso que
esta
> > > sean
> > > > > mayor que la potencia que se inserto, en caso de ser menor se
queda
> la
> > > > > potencia que se inserto.
> > > > >
> > > > > entonces en la tabla consumo se hace todo el insert sin hacer
> ninguna
> > > > > comparacion es decir el campo potencia se inserta tal como


viene,
> > luego
> > > > creo
> > > > > una vista llamada ConsumoAP para hacer los calculos.
> > > > >
> > > > > Para que se pueda entende mejor este proyecto es para facturar


la
> > > energia
> > > > > electrica consumida por un usuario,como ya saben todos los meses
se
> le
> > > > cobra
> > > > > lo que consumieron y si la potencia que consumieron es mayor que
las
> > dos
> > > > mas
> > > > > alta en los ultimos doces meses entonces se le cobra esa, de lo
> > contario
> > > > se
> > > > > le cobraria el average.
> > > > >
> > > > > Al principio el campo Potencia se tenia que extraer la maxima


que
> asi
> > es
> > > > que
> > > > > estas esta vista.
> > > > >
> > > > >
> > > > > SELECT dbo.Consumo.ConsumoID, dbo.Consumo.Fecha,
> > > > dbo.Consumo.ClienteID,
> > > > > dbo.Consumo.Mes, dbo.Consumo.Año, dbo.Consumo.Reactiva,
> > > > > dbo.Consumo.Energia, MAX(C2.Fecha) AS
> > > > > FechaConsumoAnterior,
> > > > > (SELECT MAX(Potencia)
> > > > > <-Esta parte es la que quiero
> sustituir
> > > por
> > > > el
> > > > > average
> > > > > FROM Consumo C2
> > > > > WHERE C2.Clienteid > > > Consumo.ClienteId)
> > > > AS
> > > > > Max_Potencia,
> > > > > (SELECT MAX(Potencia_Punta)
> > > > > FROM Consumo C2
> > > > > WHERE C2.Clienteid > > > Consumo.ClienteId)
> > > > AS
> > > > > Max_PotenciaPunta
> > > > > FROM dbo.Consumo LEFT OUTER JOIN
> > > > > dbo.Consumo C2 ON dbo.Consumo.ClienteID > > > > > C2.ClienteID
> > > > > AND dbo.Consumo.Fecha > C2.Fecha
> > > > > GROUP BY dbo.Consumo.ConsumoID, dbo.Consumo.Fecha,
> > > dbo.Consumo.ClienteID,
> > > > > dbo.Consumo.Mes, dbo.Consumo.Año, dbo.Consumo.Reactiva,
> > > > > dbo.Consumo.Energia
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > Vista de Consumo
> > > > >
> > > > >
> > > > > CREATE TABLE [dbo].[Consumo] (
> > > > > [ConsumoID] [int] IDENTITY (1, 1) NOT NULL ,
> > > > > [ClienteID] [int] NOT NULL ,
> > > > > [Fecha] [datetime] NOT NULL ,
> > > > > [Energia] [decimal](18, 2) NULL ,
> > > > > [Reactiva] [decimal](18, 2) NULL ,
> > > > > [Potencia] [decimal](18, 2) NULL ,
> > > > > [Potencia_punta] [decimal](18, 2) NULL ,
> > > > > [Mes] AS (case (datepart(month,[fecha])) when '01' then 'Enero'
> when
> > > '02'
> > > > > then 'Febrero' when '03' then 'Marzo' when '04' then 'Abril'


when
> '05'
> > > > then
> > > > > 'Mayo' when '06' then 'Junio' when '07' then 'Julio' when '08'
then
> > > > 'Agosto'
> > > > > when '09' then 'Septiembre' when '10' then 'Octubre' when '11'
then
> > > > > 'Noviembre' when '12' then 'Diciembre' end) ,
> > > > > [Año] AS (datename(year,[fecha])) ,
> > > > > [FechaInsertacion] [datetime] NULL ,
> > > > > [Usuario] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS
NULL
> > > > > ) ON [PRIMARY]
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>


Respuesta Responder a este mensaje
#7 Liliana Sorrentino
24/08/2004 - 18:56 | Informe spam
Julio,
cambiá la fecha de la parámetro por '20040823', se supone que es la última
fecha en que se corrió el DTS.

"Julio" escribió en el mensaje
news:
Saludos, en cuando a los del top 12 solo hacia referencia a esto pero no


es
que lo tengo implementado.
Estoy tratando de ajustar el codigo y todavia no lo logro. Con la nueva
actualizacion que me dijiste en la cual se incluia el Between me trae el
resultado en NULL
En cuanto a la fecha de insertacion es solo para llevar una referencia
cuando se corrio el DTS.

Asi quedo el codigo que me dijiste.

DECLARE @fecha datetime
SET @fecha = '20030823'

SELECT Consumo.Fecha, Consumo.Cliente,
Promedio = AVG(C2.Potencia)
FROM Consumo
LEFT JOIN
(SELECT TOP 2 Cliente, Potencia
FROM Consumo
WHERE fecha BETWEEN dateadd(yy, -1, @fecha) AND dateadd(dd, -1, @fecha)
ORDER BY Potencia DESC) C2
ON C2.Cliente = Consumo.Cliente
WHERE Consumo.Fecha >= @fecha
GROUP BY Consumo.Fecha, Consumo.Cliente

UPDATE Consumo
SET potencia = CASE WHEN Potencia < Promedio THEN Promedio END
FROM
(SELECT Cliente, Promedio = AVG(C2.Potencia)
FROM
(SELECT TOP 2 Cliente, Potencia
FROM Consumo
WHERE Fecha BETWEEN dateadd(yy, -1, @fecha) AND dateadd(dd, -1, @fecha)
ORDER BY Potencia DESC) C2
GROUP BY Cliente) C3
WHERE Fecha >= @fecha
AND C3.Cliente = Consumo.Cliente







"Liliana Sorrentino" wrote in message
news:e5$
> En mi propuesta uso la fecha por parámetro entre otras cosas para evitar
una
> subconsulta más para tomar los últimos 12.
> Por ejemplo:
> Si ayer agregaste la última lectura de cada cliente a la tabla, tendrás
que
> tomar las 12 lecturas ANTERIORES a la fecha de ayer.
> Veo que hay una "fecha de insertación", e imagino que se actualizará
> justamente con 2004/08/23.
> El query que te propongo toma las dos mayores potencias desde ayer hasta
un
> año antes, o sea 2003/08/23, y ahora que lo veo, hay un error en el
código.
> Donde dice:
> WHERE Fecha > dateadd(yy, -1, @fecha)
> debe decir
> WHERE Fecha BETWEEN dateadd(yy, -1, @fecha) AND dateadd(dd, -1, @fecha)
> esto es para que no tome la última lectura.
>
> Para integrarlo a tu código necesitaría que nos muestres el UPDATE, yo


no

> si no estaré viendo algún mensaje tuyo, pero no encuentro el TOP 12 al


que
> hacés mención.
> En mi propuesta no hay vista, es solo el UPDATE leyendo y actualizando
sobre
> la misma tabla, ¿probaste lo que te envié con mis ejemplos? ¿funciona


como
> necesitás?
>
> "Julio" escribió en el mensaje
> news:
> > Hola Liliana, Lo de la fecha no lo tenia contenplado ya que no
necesitaba
> de
> > esto, lo que pensaba era hacer un select top 12 por usuario y crear


una
> > vista con esto para luego trabajar con ella.
> >
> > Nota: El usuario solo tendra un solo consumo por mes por eso puse el
> select
> > top 12 .
> >
> > Ya entiendo lo que a hecho en todo el query que me enviaste pero no he
> > podido integrarlo al codigo mio que fueron las dos tablas que envie


para
> > poder salir de esto que no me deja tranquilo.
> >
> > Como te decia lo que sucede es que antes solo se queria la maxima
potencia
> y
> > ahora tiene que ser una relacion de las dos mas grandes en los ultimos
12
> > meses y compararlo con la que se inserto para ver cual se mantendra.
> >
> > Si puede ayudarme a integrarlo al codigo mio te lo agradecere.
> >
> > Gracias.
> >
> >
> >
> >
> >
> > "Liliana Sorrentino" wrote in message
> > news:
> > > Julio,
> > > Creo que lo que te mandé hace eso justamente, como comprenderás, no


es
> > fácil
> > > probar lo desconocido, por eso te mandé todo un juego para que las
> pruebas
> > > las hagas vos y nos digas en qué no funciona.
> > > Te explico lo que hace el UPDATE, y por supuesto puede haber mejores
> > formas:
> > >


lo
> > > manejás así.
el
> > > promedio calculado, toma el promedio
> > > UPDATE Consumo
> > > SET potencia = CASE WHEN Potencia < Promedio THEN Promedio END
> > > FROM
> > > - calcula el promedio de las potencias seleccionadas para cada
> cliente
> > > (SELECT Cliente, Promedio = AVG(C2.Potencia)
> > > FROM
> > > - toma las dos mayores potencias por c/cliente cuando la fecha


está
> > > dentro del último año según parámetro
> > > (SELECT TOP 2 Cliente, Potencia
> > > FROM Consumo
> > > WHERE Fecha > dateadd(yy, -1, @fecha)
> > > ORDER BY Potencia DESC) C2
> > > GROUP BY Cliente) C3
> > > WHERE Fecha >= @fecha
> > > AND C3.Cliente = Consumo.Cliente
> > >
> > > Saludos... Liliana.
> > >
> > >
> > > "Julio" escribió en el mensaje
> > > news:
> > > > Gracias por responder, yo tengo creado el sistema completo lo que
> > necesito
> > > > es sustituir la parte que dice Max(Potencia) por el Query que me
> > devuelva
> > > el
> > > > promedio o lo que se inserto en ese momento, es decir el que sea
> mayor.
> > > >
> > > > Si el promedio es mayor que se mantenga el promedio y si lo que se
> > inserto
> > > > es mayor que mantenga el valor que se inserto.
> > > >
> > > > El codigo que me envias lo estuve observando pero hay sierta cosas
que
> > no
> > > > entiendo en el query.
> > > >
> > > >
> > > >
> > > >
> > > > "Liliana Sorrentino" wrote in
message
> > > > news:OlRGB%
> > > > > Hola Julio,
> > > > > En una versión MUY simplificada, fijate si es algo así lo que
> > necesitás.
> > > > > Liliana.
> > > > >
> > > > > CREATE TABLE consumo
> > > > > (cliente smallint,
> > > > > fecha datetime,
> > > > > potencia smallint)
> > > > > INSERT consumo SELECT 1, '20030823', 25000
> > > > > INSERT consumo SELECT 1, '20031020', 1
> > > > > INSERT consumo SELECT 1, '20031120', 10
> > > > > INSERT consumo SELECT 1, '20031220', 100
> > > > > INSERT consumo SELECT 1, '20040120', 1000
> > > > > INSERT consumo SELECT 1, '20040220', 10000
> > > > > INSERT consumo SELECT 1, '20040320', 20000
> > > > > INSERT consumo SELECT 1, '20040823', 200
> > > > >
> > > > > create index consumo on consumo (cliente, fecha)
> > > > > create index consumo_f on consumo (fecha, cliente)
> > > > >
> > > > > SELECT * FROM consumo
> > > > >
> > > > > DECLARE @fecha datetime
> > > > > SET @fecha = '20040823'
> > > > >
> > > > > SELECT Consumo.Fecha, Consumo.Cliente,
> > > > > Promedio = AVG(C2.Potencia)
> > > > > FROM Consumo
> > > > > LEFT JOIN
> > > > > (SELECT TOP 2 Cliente, Potencia
> > > > > FROM Consumo
> > > > > WHERE Fecha > dateadd(yy, -1, @fecha)
> > > > > ORDER BY Potencia DESC) C2
> > > > > ON C2.Cliente = Consumo.Cliente
> > > > > WHERE Consumo.Fecha >= @fecha
> > > > > GROUP BY Consumo.Fecha, Consumo.Cliente
> > > > >
> > > > > UPDATE Consumo
> > > > > SET potencia = CASE WHEN Potencia < Promedio THEN Promedio


END
> > > > > FROM
> > > > > (SELECT Cliente, Promedio = AVG(C2.Potencia)
> > > > > FROM
> > > > > (SELECT TOP 2 Cliente, Potencia
> > > > > FROM Consumo
> > > > > WHERE Fecha > dateadd(yy, -1, @fecha)
> > > > > ORDER BY Potencia DESC) C2
> > > > > GROUP BY Cliente) C3
> > > > > WHERE Fecha >= @fecha
> > > > > AND C3.Cliente = Consumo.Cliente
> > > > >
> > > > > SELECT * FROM consumo
> > > > >
> > > > >
> > > > >
> > > > > "Julio" escribió en el mensaje
> > > > > news:
> > > > > > Hola grupo
> > > > > >
> > > > > > Tengo un problema con algo aqui y quisiera ver si me pueden


dar
> una
> > > mano
> > > > > con
> > > > > > esto.
> > > > > >
> > > > > > Tengo una tabla llamada Consumo la cual es alimentada por un


DTS
> que
> > > > > > introduce todos los datos en ellas, tengo un caso y es el
> siguiente.
> > > > > > Cada vez que se haga un insert en la tabla consumo el campo


que
> dice
> > > > > > Potencia de la tabla Consumo sera igual al average de las dos
> > potencia
> > > > mas
> > > > > > alta durante los ultimos 12 meses que han pasado en el caso


que
> esta
> > > > sean
> > > > > > mayor que la potencia que se inserto, en caso de ser menor se
> queda
> > la
> > > > > > potencia que se inserto.
> > > > > >
> > > > > > entonces en la tabla consumo se hace todo el insert sin hacer
> > ninguna
> > > > > > comparacion es decir el campo potencia se inserta tal como
viene,
> > > luego
> > > > > creo
> > > > > > una vista llamada ConsumoAP para hacer los calculos.
> > > > > >
> > > > > > Para que se pueda entende mejor este proyecto es para facturar
la
> > > > energia
> > > > > > electrica consumida por un usuario,como ya saben todos los


meses
> se
> > le
> > > > > cobra
> > > > > > lo que consumieron y si la potencia que consumieron es mayor


que
> las
> > > dos
> > > > > mas
> > > > > > alta en los ultimos doces meses entonces se le cobra esa, de


lo
> > > contario
> > > > > se
> > > > > > le cobraria el average.
> > > > > >
> > > > > > Al principio el campo Potencia se tenia que extraer la maxima
que
> > asi
> > > es
> > > > > que
> > > > > > estas esta vista.
> > > > > >
> > > > > >
> > > > > > SELECT dbo.Consumo.ConsumoID, dbo.Consumo.Fecha,
> > > > > dbo.Consumo.ClienteID,
> > > > > > dbo.Consumo.Mes, dbo.Consumo.Año, dbo.Consumo.Reactiva,
> > > > > > dbo.Consumo.Energia, MAX(C2.Fecha) AS
> > > > > > FechaConsumoAnterior,
> > > > > > (SELECT MAX(Potencia)
> > > > > > <-Esta parte es la que quiero
> > sustituir
> > > > por
> > > > > el
> > > > > > average
> > > > > > FROM Consumo C2
> > > > > > WHERE C2.Clienteid > > > > Consumo.ClienteId)
> > > > > AS
> > > > > > Max_Potencia,
> > > > > > (SELECT MAX(Potencia_Punta)
> > > > > > FROM Consumo C2
> > > > > > WHERE C2.Clienteid > > > > Consumo.ClienteId)
> > > > > AS
> > > > > > Max_PotenciaPunta
> > > > > > FROM dbo.Consumo LEFT OUTER JOIN
> > > > > > dbo.Consumo C2 ON dbo.Consumo.ClienteID
> > > > > C2.ClienteID
> > > > > > AND dbo.Consumo.Fecha > C2.Fecha
> > > > > > GROUP BY dbo.Consumo.ConsumoID, dbo.Consumo.Fecha,
> > > > dbo.Consumo.ClienteID,
> > > > > > dbo.Consumo.Mes, dbo.Consumo.Año, dbo.Consumo.Reactiva,
> > > > > > dbo.Consumo.Energia
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > > Vista de Consumo
> > > > > >
> > > > > >
> > > > > > CREATE TABLE [dbo].[Consumo] (
> > > > > > [ConsumoID] [int] IDENTITY (1, 1) NOT NULL ,
> > > > > > [ClienteID] [int] NOT NULL ,
> > > > > > [Fecha] [datetime] NOT NULL ,
> > > > > > [Energia] [decimal](18, 2) NULL ,
> > > > > > [Reactiva] [decimal](18, 2) NULL ,
> > > > > > [Potencia] [decimal](18, 2) NULL ,
> > > > > > [Potencia_punta] [decimal](18, 2) NULL ,
> > > > > > [Mes] AS (case (datepart(month,[fecha])) when '01' then


'Enero'
> > when
> > > > '02'
> > > > > > then 'Febrero' when '03' then 'Marzo' when '04' then 'Abril'
when
> > '05'
> > > > > then
> > > > > > 'Mayo' when '06' then 'Junio' when '07' then 'Julio' when '08'
> then
> > > > > 'Agosto'
> > > > > > when '09' then 'Septiembre' when '10' then 'Octubre' when '11'
> then
> > > > > > 'Noviembre' when '12' then 'Diciembre' end) ,
> > > > > > [Año] AS (datename(year,[fecha])) ,
> > > > > > [FechaInsertacion] [datetime] NULL ,
> > > > > > [Usuario] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS
> NULL
> > > > > > ) ON [PRIMARY]
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>


Respuesta Responder a este mensaje
#8 Julio
24/08/2004 - 19:54 | Informe spam
Hola, Cuando corro el el ejemplo que me enviaste aiendo un insert uno por
uno, estoy teneiendo un problema y es el siguiente:

Cuando inserto : INSERT consumo SELECT 1, '20040824', 25

luego corro el codigo:

DECLARE @fecha datetime
SET @fecha = '20040824'

SELECT Consumo.Fecha, Consumo.Cliente,
Promedio = AVG(C2.Potencia)
FROM Consumo
LEFT JOIN
(SELECT TOP 2 Cliente, Potencia
FROM Consumo
WHERE fecha BETWEEN dateadd(yy, -1, @fecha) AND dateadd(dd, -1, @fecha)
ORDER BY Potencia DESC) C2
ON C2.Cliente = Consumo.Cliente
WHERE Consumo.Fecha >= @fecha
GROUP BY Consumo.Fecha, Consumo.Cliente

UPDATE Consumo
SET potencia = CASE WHEN Potencia < Promedio THEN Promedio END
FROM
(SELECT Cliente, Promedio = AVG(C2.Potencia)
FROM
(SELECT TOP 2 Cliente, Potencia
FROM Consumo
WHERE Fecha BETWEEN dateadd(yy, -1, @fecha) AND dateadd(dd, -1, @fecha)
ORDER BY Potencia DESC) C2
GROUP BY Cliente) C3
WHERE Fecha >= @fecha
AND C3.Cliente = Consumo.Cliente

El resultado me lo trae NULL


Una pregunta, la fecha del parametro debe ser igual a la fecha de la
lectura?





"Liliana Sorrentino" wrote in message
news:%
Julio,
cambiá la fecha de la parámetro por '20040823', se supone que es la última
fecha en que se corrió el DTS.

"Julio" escribió en el mensaje
news:
> Saludos, en cuando a los del top 12 solo hacia referencia a esto pero no
es
> que lo tengo implementado.
> Estoy tratando de ajustar el codigo y todavia no lo logro. Con la nueva
> actualizacion que me dijiste en la cual se incluia el Between me trae el
> resultado en NULL
> En cuanto a la fecha de insertacion es solo para llevar una referencia
> cuando se corrio el DTS.
>
> Asi quedo el codigo que me dijiste.
>
> DECLARE @fecha datetime
> SET @fecha = '20030823'
>
> SELECT Consumo.Fecha, Consumo.Cliente,
> Promedio = AVG(C2.Potencia)
> FROM Consumo
> LEFT JOIN
> (SELECT TOP 2 Cliente, Potencia
> FROM Consumo
> WHERE fecha BETWEEN dateadd(yy, -1, @fecha) AND dateadd(dd, -1,


@fecha)
> ORDER BY Potencia DESC) C2
> ON C2.Cliente = Consumo.Cliente
> WHERE Consumo.Fecha >= @fecha
> GROUP BY Consumo.Fecha, Consumo.Cliente
>
> UPDATE Consumo
> SET potencia = CASE WHEN Potencia < Promedio THEN Promedio END
> FROM
> (SELECT Cliente, Promedio = AVG(C2.Potencia)
> FROM
> (SELECT TOP 2 Cliente, Potencia
> FROM Consumo
> WHERE Fecha BETWEEN dateadd(yy, -1, @fecha) AND dateadd(dd, -1,


@fecha)
> ORDER BY Potencia DESC) C2
> GROUP BY Cliente) C3
> WHERE Fecha >= @fecha
> AND C3.Cliente = Consumo.Cliente
>
>
>
>
>
>
>
> "Liliana Sorrentino" wrote in message
> news:e5$
> > En mi propuesta uso la fecha por parámetro entre otras cosas para


evitar
> una
> > subconsulta más para tomar los últimos 12.
> > Por ejemplo:
> > Si ayer agregaste la última lectura de cada cliente a la tabla,


tendrás
> que
> > tomar las 12 lecturas ANTERIORES a la fecha de ayer.
> > Veo que hay una "fecha de insertación", e imagino que se actualizará
> > justamente con 2004/08/23.
> > El query que te propongo toma las dos mayores potencias desde ayer


hasta
> un
> > año antes, o sea 2003/08/23, y ahora que lo veo, hay un error en el
> código.
> > Donde dice:
> > WHERE Fecha > dateadd(yy, -1, @fecha)
> > debe decir
> > WHERE Fecha BETWEEN dateadd(yy, -1, @fecha) AND dateadd(dd, -1,


@fecha)
> > esto es para que no tome la última lectura.
> >
> > Para integrarlo a tu código necesitaría que nos muestres el UPDATE, yo
no
> sé
> > si no estaré viendo algún mensaje tuyo, pero no encuentro el TOP 12 al
que
> > hacés mención.
> > En mi propuesta no hay vista, es solo el UPDATE leyendo y actualizando
> sobre
> > la misma tabla, ¿probaste lo que te envié con mis ejemplos? ¿funciona
como
> > necesitás?
> >
> > "Julio" escribió en el mensaje
> > news:
> > > Hola Liliana, Lo de la fecha no lo tenia contenplado ya que no
> necesitaba
> > de
> > > esto, lo que pensaba era hacer un select top 12 por usuario y crear
una
> > > vista con esto para luego trabajar con ella.
> > >
> > > Nota: El usuario solo tendra un solo consumo por mes por eso puse el
> > select
> > > top 12 .
> > >
> > > Ya entiendo lo que a hecho en todo el query que me enviaste pero no


he
> > > podido integrarlo al codigo mio que fueron las dos tablas que envie
para
> > > poder salir de esto que no me deja tranquilo.
> > >
> > > Como te decia lo que sucede es que antes solo se queria la maxima
> potencia
> > y
> > > ahora tiene que ser una relacion de las dos mas grandes en los


ultimos
> 12
> > > meses y compararlo con la que se inserto para ver cual se mantendra.
> > >
> > > Si puede ayudarme a integrarlo al codigo mio te lo agradecere.
> > >
> > > Gracias.
> > >
> > >
> > >
> > >
> > >
> > > "Liliana Sorrentino" wrote in


message
> > > news:
> > > > Julio,
> > > > Creo que lo que te mandé hace eso justamente, como comprenderás,


no
es
> > > fácil
> > > > probar lo desconocido, por eso te mandé todo un juego para que las
> > pruebas
> > > > las hagas vos y nos digas en qué no funciona.
> > > > Te explico lo que hace el UPDATE, y por supuesto puede haber


mejores
> > > formas:
> > > >


que
lo
> > > > manejás así.


que
> el
> > > > promedio calculado, toma el promedio
> > > > UPDATE Consumo
> > > > SET potencia = CASE WHEN Potencia < Promedio THEN Promedio END
> > > > FROM
> > > > - calcula el promedio de las potencias seleccionadas para cada
> > cliente
> > > > (SELECT Cliente, Promedio = AVG(C2.Potencia)
> > > > FROM
> > > > - toma las dos mayores potencias por c/cliente cuando la fecha
está
> > > > dentro del último año según parámetro
> > > > (SELECT TOP 2 Cliente, Potencia
> > > > FROM Consumo
> > > > WHERE Fecha > dateadd(yy, -1, @fecha)
> > > > ORDER BY Potencia DESC) C2
> > > > GROUP BY Cliente) C3
> > > > WHERE Fecha >= @fecha
> > > > AND C3.Cliente = Consumo.Cliente
> > > >
> > > > Saludos... Liliana.
> > > >
> > > >
> > > > "Julio" escribió en el mensaje
> > > > news:
> > > > > Gracias por responder, yo tengo creado el sistema completo lo


que
> > > necesito
> > > > > es sustituir la parte que dice Max(Potencia) por el Query que me
> > > devuelva
> > > > el
> > > > > promedio o lo que se inserto en ese momento, es decir el que sea
> > mayor.
> > > > >
> > > > > Si el promedio es mayor que se mantenga el promedio y si lo que


se
> > > inserto
> > > > > es mayor que mantenga el valor que se inserto.
> > > > >
> > > > > El codigo que me envias lo estuve observando pero hay sierta


cosas
> que
> > > no
> > > > > entiendo en el query.
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > "Liliana Sorrentino" wrote in
> message
> > > > > news:OlRGB%
> > > > > > Hola Julio,
> > > > > > En una versión MUY simplificada, fijate si es algo así lo que
> > > necesitás.
> > > > > > Liliana.
> > > > > >
> > > > > > CREATE TABLE consumo
> > > > > > (cliente smallint,
> > > > > > fecha datetime,
> > > > > > potencia smallint)
> > > > > > INSERT consumo SELECT 1, '20030823', 25000
> > > > > > INSERT consumo SELECT 1, '20031020', 1
> > > > > > INSERT consumo SELECT 1, '20031120', 10
> > > > > > INSERT consumo SELECT 1, '20031220', 100
> > > > > > INSERT consumo SELECT 1, '20040120', 1000
> > > > > > INSERT consumo SELECT 1, '20040220', 10000
> > > > > > INSERT consumo SELECT 1, '20040320', 20000
> > > > > > INSERT consumo SELECT 1, '20040823', 200
> > > > > >
> > > > > > create index consumo on consumo (cliente, fecha)
> > > > > > create index consumo_f on consumo (fecha, cliente)
> > > > > >
> > > > > > SELECT * FROM consumo
> > > > > >
> > > > > > DECLARE @fecha datetime
> > > > > > SET @fecha = '20040823'
> > > > > >
> > > > > > SELECT Consumo.Fecha, Consumo.Cliente,
> > > > > > Promedio = AVG(C2.Potencia)
> > > > > > FROM Consumo
> > > > > > LEFT JOIN
> > > > > > (SELECT TOP 2 Cliente, Potencia
> > > > > > FROM Consumo
> > > > > > WHERE Fecha > dateadd(yy, -1, @fecha)
> > > > > > ORDER BY Potencia DESC) C2
> > > > > > ON C2.Cliente = Consumo.Cliente
> > > > > > WHERE Consumo.Fecha >= @fecha
> > > > > > GROUP BY Consumo.Fecha, Consumo.Cliente
> > > > > >
> > > > > > UPDATE Consumo
> > > > > > SET potencia = CASE WHEN Potencia < Promedio THEN Promedio
END
> > > > > > FROM
> > > > > > (SELECT Cliente, Promedio = AVG(C2.Potencia)
> > > > > > FROM
> > > > > > (SELECT TOP 2 Cliente, Potencia
> > > > > > FROM Consumo
> > > > > > WHERE Fecha > dateadd(yy, -1, @fecha)
> > > > > > ORDER BY Potencia DESC) C2
> > > > > > GROUP BY Cliente) C3
> > > > > > WHERE Fecha >= @fecha
> > > > > > AND C3.Cliente = Consumo.Cliente
> > > > > >
> > > > > > SELECT * FROM consumo
> > > > > >
> > > > > >
> > > > > >
> > > > > > "Julio" escribió en el mensaje
> > > > > > news:
> > > > > > > Hola grupo
> > > > > > >
> > > > > > > Tengo un problema con algo aqui y quisiera ver si me pueden
dar
> > una
> > > > mano
> > > > > > con
> > > > > > > esto.
> > > > > > >
> > > > > > > Tengo una tabla llamada Consumo la cual es alimentada por un
DTS
> > que
> > > > > > > introduce todos los datos en ellas, tengo un caso y es el
> > siguiente.
> > > > > > > Cada vez que se haga un insert en la tabla consumo el campo
que
> > dice
> > > > > > > Potencia de la tabla Consumo sera igual al average de las


dos
> > > potencia
> > > > > mas
> > > > > > > alta durante los ultimos 12 meses que han pasado en el caso
que
> > esta
> > > > > sean
> > > > > > > mayor que la potencia que se inserto, en caso de ser menor


se
> > queda
> > > la
> > > > > > > potencia que se inserto.
> > > > > > >
> > > > > > > entonces en la tabla consumo se hace todo el insert sin


hacer
> > > ninguna
> > > > > > > comparacion es decir el campo potencia se inserta tal como
> viene,
> > > > luego
> > > > > > creo
> > > > > > > una vista llamada ConsumoAP para hacer los calculos.
> > > > > > >
> > > > > > > Para que se pueda entende mejor este proyecto es para


facturar
> la
> > > > > energia
> > > > > > > electrica consumida por un usuario,como ya saben todos los
meses
> > se
> > > le
> > > > > > cobra
> > > > > > > lo que consumieron y si la potencia que consumieron es mayor
que
> > las
> > > > dos
> > > > > > mas
> > > > > > > alta en los ultimos doces meses entonces se le cobra esa, de
lo
> > > > contario
> > > > > > se
> > > > > > > le cobraria el average.
> > > > > > >
> > > > > > > Al principio el campo Potencia se tenia que extraer la


maxima
> que
> > > asi
> > > > es
> > > > > > que
> > > > > > > estas esta vista.
> > > > > > >
> > > > > > >
> > > > > > > SELECT dbo.Consumo.ConsumoID, dbo.Consumo.Fecha,
> > > > > > dbo.Consumo.ClienteID,
> > > > > > > dbo.Consumo.Mes, dbo.Consumo.Año, dbo.Consumo.Reactiva,
> > > > > > > dbo.Consumo.Energia, MAX(C2.Fecha) AS
> > > > > > > FechaConsumoAnterior,
> > > > > > > (SELECT MAX(Potencia)
> > > > > > > <-Esta parte es la que quiero
> > > sustituir
> > > > > por
> > > > > > el
> > > > > > > average
> > > > > > > FROM Consumo C2
> > > > > > > WHERE C2.Clienteid > > > > > Consumo.ClienteId)
> > > > > > AS
> > > > > > > Max_Potencia,
> > > > > > > (SELECT MAX(Potencia_Punta)
> > > > > > > FROM Consumo C2
> > > > > > > WHERE C2.Clienteid > > > > > Consumo.ClienteId)
> > > > > > AS
> > > > > > > Max_PotenciaPunta
> > > > > > > FROM dbo.Consumo LEFT OUTER JOIN
> > > > > > > dbo.Consumo C2 ON


dbo.Consumo.ClienteID
> > > > > > > C2.ClienteID
> > > > > > > AND dbo.Consumo.Fecha > C2.Fecha
> > > > > > > GROUP BY dbo.Consumo.ConsumoID, dbo.Consumo.Fecha,
> > > > > dbo.Consumo.ClienteID,
> > > > > > > dbo.Consumo.Mes, dbo.Consumo.Año, dbo.Consumo.Reactiva,
> > > > > > > dbo.Consumo.Energia
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > Vista de Consumo
> > > > > > >
> > > > > > >
> > > > > > > CREATE TABLE [dbo].[Consumo] (
> > > > > > > [ConsumoID] [int] IDENTITY (1, 1) NOT NULL ,
> > > > > > > [ClienteID] [int] NOT NULL ,
> > > > > > > [Fecha] [datetime] NOT NULL ,
> > > > > > > [Energia] [decimal](18, 2) NULL ,
> > > > > > > [Reactiva] [decimal](18, 2) NULL ,
> > > > > > > [Potencia] [decimal](18, 2) NULL ,
> > > > > > > [Potencia_punta] [decimal](18, 2) NULL ,
> > > > > > > [Mes] AS (case (datepart(month,[fecha])) when '01' then
'Enero'
> > > when
> > > > > '02'
> > > > > > > then 'Febrero' when '03' then 'Marzo' when '04' then 'Abril'
> when
> > > '05'
> > > > > > then
> > > > > > > 'Mayo' when '06' then 'Junio' when '07' then 'Julio' when


'08'
> > then
> > > > > > 'Agosto'
> > > > > > > when '09' then 'Septiembre' when '10' then 'Octubre' when


'11'
> > then
> > > > > > > 'Noviembre' when '12' then 'Diciembre' end) ,
> > > > > > > [Año] AS (datename(year,[fecha])) ,
> > > > > > > [FechaInsertacion] [datetime] NULL ,
> > > > > > > [Usuario] [varchar] (50) COLLATE


SQL_Latin1_General_CP1_CI_AS
> > NULL
> > > > > > > ) ON [PRIMARY]
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>


Respuesta Responder a este mensaje
#9 Liliana Sorrentino
24/08/2004 - 20:20 | Informe spam
Hola Julio,
Con la tabla vacía, hacés un INSERT, y es lógico que devuelva NULL, porque
no tiene nada en los meses anteriores para esta cuenta.
Cambié el código para que te devuelva 0 en lugar de NULL en la consulta, y
también en el UPDATE.
La fecha de la parámetro debería ser la de la última incorporación de datos
en la tabla.

SELECT Consumo.Fecha, Consumo.Cliente,
Promedio = ISNULL(AVG(C2.Potencia),0)
FROM Consumo
LEFT JOIN
(SELECT TOP 2 Cliente, Potencia
FROM Consumo
WHERE fecha BETWEEN dateadd(yy, -1, @fecha) AND dateadd(dd, -1, @fecha)
ORDER BY Potencia DESC) C2
ON C2.Cliente = Consumo.Cliente
WHERE Consumo.Fecha >= @fecha
GROUP BY Consumo.Fecha, Consumo.Cliente

UPDATE Consumo
SET potencia = CASE WHEN Potencia < ISNULL(Promedio,0) THEN Promedio END
FROM
(SELECT Cliente, Promedio = AVG(C2.Potencia)
FROM
(SELECT TOP 2 Cliente, Potencia
FROM Consumo
WHERE Fecha BETWEEN dateadd(yy, -1, @fecha) AND dateadd(dd, -1, @fecha)
ORDER BY Potencia DESC) C2
GROUP BY Cliente) C3
WHERE Fecha >= @fecha
AND C3.Cliente = Consumo.Cliente

SELECT * FROM consumo

"Julio" escribió en el mensaje
news:
Hola, Cuando corro el el ejemplo que me enviaste aiendo un insert uno por
uno, estoy teneiendo un problema y es el siguiente:

Cuando inserto : INSERT consumo SELECT 1, '20040824', 25

luego corro el codigo:

DECLARE @fecha datetime
SET @fecha = '20040824'

SELECT Consumo.Fecha, Consumo.Cliente,
Promedio = AVG(C2.Potencia)
FROM Consumo
LEFT JOIN
(SELECT TOP 2 Cliente, Potencia
FROM Consumo
WHERE fecha BETWEEN dateadd(yy, -1, @fecha) AND dateadd(dd, -1, @fecha)
ORDER BY Potencia DESC) C2
ON C2.Cliente = Consumo.Cliente
WHERE Consumo.Fecha >= @fecha
GROUP BY Consumo.Fecha, Consumo.Cliente

UPDATE Consumo
SET potencia = CASE WHEN Potencia < Promedio THEN Promedio END
FROM
(SELECT Cliente, Promedio = AVG(C2.Potencia)
FROM
(SELECT TOP 2 Cliente, Potencia
FROM Consumo
WHERE Fecha BETWEEN dateadd(yy, -1, @fecha) AND dateadd(dd, -1, @fecha)
ORDER BY Potencia DESC) C2
GROUP BY Cliente) C3
WHERE Fecha >= @fecha
AND C3.Cliente = Consumo.Cliente

El resultado me lo trae NULL


Una pregunta, la fecha del parametro debe ser igual a la fecha de la
lectura?





"Liliana Sorrentino" wrote in message
news:%
> Julio,
> cambiá la fecha de la parámetro por '20040823', se supone que es la


última
> fecha en que se corrió el DTS.
>
> "Julio" escribió en el mensaje
> news:
> > Saludos, en cuando a los del top 12 solo hacia referencia a esto pero


no
> es
> > que lo tengo implementado.
> > Estoy tratando de ajustar el codigo y todavia no lo logro. Con la


nueva
> > actualizacion que me dijiste en la cual se incluia el Between me trae


el
> > resultado en NULL
> > En cuanto a la fecha de insertacion es solo para llevar una referencia
> > cuando se corrio el DTS.
> >
> > Asi quedo el codigo que me dijiste.
> >
> > DECLARE @fecha datetime
> > SET @fecha = '20030823'
> >
> > SELECT Consumo.Fecha, Consumo.Cliente,
> > Promedio = AVG(C2.Potencia)
> > FROM Consumo
> > LEFT JOIN
> > (SELECT TOP 2 Cliente, Potencia
> > FROM Consumo
> > WHERE fecha BETWEEN dateadd(yy, -1, @fecha) AND dateadd(dd, -1,
@fecha)
> > ORDER BY Potencia DESC) C2
> > ON C2.Cliente = Consumo.Cliente
> > WHERE Consumo.Fecha >= @fecha
> > GROUP BY Consumo.Fecha, Consumo.Cliente
> >
> > UPDATE Consumo
> > SET potencia = CASE WHEN Potencia < Promedio THEN Promedio END
> > FROM
> > (SELECT Cliente, Promedio = AVG(C2.Potencia)
> > FROM
> > (SELECT TOP 2 Cliente, Potencia
> > FROM Consumo
> > WHERE Fecha BETWEEN dateadd(yy, -1, @fecha) AND dateadd(dd, -1,
@fecha)
> > ORDER BY Potencia DESC) C2
> > GROUP BY Cliente) C3
> > WHERE Fecha >= @fecha
> > AND C3.Cliente = Consumo.Cliente
> >
> >
> >
> >
> >
> >
> >
> > "Liliana Sorrentino" wrote in message
> > news:e5$
> > > En mi propuesta uso la fecha por parámetro entre otras cosas para
evitar
> > una
> > > subconsulta más para tomar los últimos 12.
> > > Por ejemplo:
> > > Si ayer agregaste la última lectura de cada cliente a la tabla,
tendrás
> > que
> > > tomar las 12 lecturas ANTERIORES a la fecha de ayer.
> > > Veo que hay una "fecha de insertación", e imagino que se actualizará
> > > justamente con 2004/08/23.
> > > El query que te propongo toma las dos mayores potencias desde ayer
hasta
> > un
> > > año antes, o sea 2003/08/23, y ahora que lo veo, hay un error en el
> > código.
> > > Donde dice:
> > > WHERE Fecha > dateadd(yy, -1, @fecha)
> > > debe decir
> > > WHERE Fecha BETWEEN dateadd(yy, -1, @fecha) AND dateadd(dd, -1,
@fecha)
> > > esto es para que no tome la última lectura.
> > >
> > > Para integrarlo a tu código necesitaría que nos muestres el UPDATE,


yo
> no
> > sé
> > > si no estaré viendo algún mensaje tuyo, pero no encuentro el TOP 12


al
> que
> > > hacés mención.
> > > En mi propuesta no hay vista, es solo el UPDATE leyendo y


actualizando
> > sobre
> > > la misma tabla, ¿probaste lo que te envié con mis ejemplos?


¿funciona
> como
> > > necesitás?
> > >
> > > "Julio" escribió en el mensaje
> > > news:
> > > > Hola Liliana, Lo de la fecha no lo tenia contenplado ya que no
> > necesitaba
> > > de
> > > > esto, lo que pensaba era hacer un select top 12 por usuario y


crear
> una
> > > > vista con esto para luego trabajar con ella.
> > > >
> > > > Nota: El usuario solo tendra un solo consumo por mes por eso puse


el
> > > select
> > > > top 12 .
> > > >
> > > > Ya entiendo lo que a hecho en todo el query que me enviaste pero


no
he
> > > > podido integrarlo al codigo mio que fueron las dos tablas que


envie
> para
> > > > poder salir de esto que no me deja tranquilo.
> > > >
> > > > Como te decia lo que sucede es que antes solo se queria la maxima
> > potencia
> > > y
> > > > ahora tiene que ser una relacion de las dos mas grandes en los
ultimos
> > 12
> > > > meses y compararlo con la que se inserto para ver cual se


mantendra.
> > > >
> > > > Si puede ayudarme a integrarlo al codigo mio te lo agradecere.
> > > >
> > > > Gracias.
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > "Liliana Sorrentino" wrote in
message
> > > > news:
> > > > > Julio,
> > > > > Creo que lo que te mandé hace eso justamente, como comprenderás,
no
> es
> > > > fácil
> > > > > probar lo desconocido, por eso te mandé todo un juego para que


las
> > > pruebas
> > > > > las hagas vos y nos digas en qué no funciona.
> > > > > Te explico lo que hace el UPDATE, y por supuesto puede haber
mejores
> > > > formas:
> > > > >
que
> lo
> > > > > manejás así.
que
> > el
> > > > > promedio calculado, toma el promedio
> > > > > UPDATE Consumo
> > > > > SET potencia = CASE WHEN Potencia < Promedio THEN Promedio


END
> > > > > FROM
> > > > > - calcula el promedio de las potencias seleccionadas para


cada
> > > cliente
> > > > > (SELECT Cliente, Promedio = AVG(C2.Potencia)
> > > > > FROM
> > > > > - toma las dos mayores potencias por c/cliente cuando la


fecha
> está
> > > > > dentro del último año según parámetro
> > > > > (SELECT TOP 2 Cliente, Potencia
> > > > > FROM Consumo
> > > > > WHERE Fecha > dateadd(yy, -1, @fecha)
> > > > > ORDER BY Potencia DESC) C2
> > > > > GROUP BY Cliente) C3
> > > > > WHERE Fecha >= @fecha
> > > > > AND C3.Cliente = Consumo.Cliente
> > > > >
> > > > > Saludos... Liliana.
> > > > >
> > > > >
> > > > > "Julio" escribió en el mensaje
> > > > > news:
> > > > > > Gracias por responder, yo tengo creado el sistema completo lo
que
> > > > necesito
> > > > > > es sustituir la parte que dice Max(Potencia) por el Query que


me
> > > > devuelva
> > > > > el
> > > > > > promedio o lo que se inserto en ese momento, es decir el que


sea
> > > mayor.
> > > > > >
> > > > > > Si el promedio es mayor que se mantenga el promedio y si lo


que
se
> > > > inserto
> > > > > > es mayor que mantenga el valor que se inserto.
> > > > > >
> > > > > > El codigo que me envias lo estuve observando pero hay sierta
cosas
> > que
> > > > no
> > > > > > entiendo en el query.
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > > "Liliana Sorrentino" wrote in
> > message
> > > > > > news:OlRGB%
> > > > > > > Hola Julio,
> > > > > > > En una versión MUY simplificada, fijate si es algo así lo


que
> > > > necesitás.
> > > > > > > Liliana.
> > > > > > >
> > > > > > > CREATE TABLE consumo
> > > > > > > (cliente smallint,
> > > > > > > fecha datetime,
> > > > > > > potencia smallint)
> > > > > > > INSERT consumo SELECT 1, '20030823', 25000
> > > > > > > INSERT consumo SELECT 1, '20031020', 1
> > > > > > > INSERT consumo SELECT 1, '20031120', 10
> > > > > > > INSERT consumo SELECT 1, '20031220', 100
> > > > > > > INSERT consumo SELECT 1, '20040120', 1000
> > > > > > > INSERT consumo SELECT 1, '20040220', 10000
> > > > > > > INSERT consumo SELECT 1, '20040320', 20000
> > > > > > > INSERT consumo SELECT 1, '20040823', 200
> > > > > > >
> > > > > > > create index consumo on consumo (cliente, fecha)
> > > > > > > create index consumo_f on consumo (fecha, cliente)
> > > > > > >
> > > > > > > SELECT * FROM consumo
> > > > > > >
> > > > > > > DECLARE @fecha datetime
> > > > > > > SET @fecha = '20040823'
> > > > > > >
> > > > > > > SELECT Consumo.Fecha, Consumo.Cliente,
> > > > > > > Promedio = AVG(C2.Potencia)
> > > > > > > FROM Consumo
> > > > > > > LEFT JOIN
> > > > > > > (SELECT TOP 2 Cliente, Potencia
> > > > > > > FROM Consumo
> > > > > > > WHERE Fecha > dateadd(yy, -1, @fecha)
> > > > > > > ORDER BY Potencia DESC) C2
> > > > > > > ON C2.Cliente = Consumo.Cliente
> > > > > > > WHERE Consumo.Fecha >= @fecha
> > > > > > > GROUP BY Consumo.Fecha, Consumo.Cliente
> > > > > > >
> > > > > > > UPDATE Consumo
> > > > > > > SET potencia = CASE WHEN Potencia < Promedio THEN


Promedio
> END
> > > > > > > FROM
> > > > > > > (SELECT Cliente, Promedio = AVG(C2.Potencia)
> > > > > > > FROM
> > > > > > > (SELECT TOP 2 Cliente, Potencia
> > > > > > > FROM Consumo
> > > > > > > WHERE Fecha > dateadd(yy, -1, @fecha)
> > > > > > > ORDER BY Potencia DESC) C2
> > > > > > > GROUP BY Cliente) C3
> > > > > > > WHERE Fecha >= @fecha
> > > > > > > AND C3.Cliente = Consumo.Cliente
> > > > > > >
> > > > > > > SELECT * FROM consumo
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > "Julio" escribió en el mensaje
> > > > > > > news:
> > > > > > > > Hola grupo
> > > > > > > >
> > > > > > > > Tengo un problema con algo aqui y quisiera ver si me


pueden
> dar
> > > una
> > > > > mano
> > > > > > > con
> > > > > > > > esto.
> > > > > > > >
> > > > > > > > Tengo una tabla llamada Consumo la cual es alimentada por


un
> DTS
> > > que
> > > > > > > > introduce todos los datos en ellas, tengo un caso y es el
> > > siguiente.
> > > > > > > > Cada vez que se haga un insert en la tabla consumo el


campo
> que
> > > dice
> > > > > > > > Potencia de la tabla Consumo sera igual al average de las
dos
> > > > potencia
> > > > > > mas
> > > > > > > > alta durante los ultimos 12 meses que han pasado en el


caso
> que
> > > esta
> > > > > > sean
> > > > > > > > mayor que la potencia que se inserto, en caso de ser menor
se
> > > queda
> > > > la
> > > > > > > > potencia que se inserto.
> > > > > > > >
> > > > > > > > entonces en la tabla consumo se hace todo el insert sin
hacer
> > > > ninguna
> > > > > > > > comparacion es decir el campo potencia se inserta tal como
> > viene,
> > > > > luego
> > > > > > > creo
> > > > > > > > una vista llamada ConsumoAP para hacer los calculos.
> > > > > > > >
> > > > > > > > Para que se pueda entende mejor este proyecto es para
facturar
> > la
> > > > > > energia
> > > > > > > > electrica consumida por un usuario,como ya saben todos los
> meses
> > > se
> > > > le
> > > > > > > cobra
> > > > > > > > lo que consumieron y si la potencia que consumieron es


mayor
> que
> > > las
> > > > > dos
> > > > > > > mas
> > > > > > > > alta en los ultimos doces meses entonces se le cobra esa,


de
> lo
> > > > > contario
> > > > > > > se
> > > > > > > > le cobraria el average.
> > > > > > > >
> > > > > > > > Al principio el campo Potencia se tenia que extraer la
maxima
> > que
> > > > asi
> > > > > es
> > > > > > > que
> > > > > > > > estas esta vista.
> > > > > > > >
> > > > > > > >
> > > > > > > > SELECT dbo.Consumo.ConsumoID, dbo.Consumo.Fecha,
> > > > > > > dbo.Consumo.ClienteID,
> > > > > > > > dbo.Consumo.Mes, dbo.Consumo.Año, dbo.Consumo.Reactiva,
> > > > > > > > dbo.Consumo.Energia, MAX(C2.Fecha)


AS
> > > > > > > > FechaConsumoAnterior,
> > > > > > > > (SELECT MAX(Potencia)
> > > > > > > > <-Esta parte es la que


quiero
> > > > sustituir
> > > > > > por
> > > > > > > el
> > > > > > > > average
> > > > > > > > FROM Consumo C2
> > > > > > > > WHERE C2.Clienteid > > > > > > Consumo.ClienteId)
> > > > > > > AS
> > > > > > > > Max_Potencia,
> > > > > > > > (SELECT MAX(Potencia_Punta)
> > > > > > > > FROM Consumo C2
> > > > > > > > WHERE C2.Clienteid > > > > > > Consumo.ClienteId)
> > > > > > > AS
> > > > > > > > Max_PotenciaPunta
> > > > > > > > FROM dbo.Consumo LEFT OUTER JOIN
> > > > > > > > dbo.Consumo C2 ON
dbo.Consumo.ClienteID
> > > > > > > > > C2.ClienteID
> > > > > > > > AND dbo.Consumo.Fecha > C2.Fecha
> > > > > > > > GROUP BY dbo.Consumo.ConsumoID, dbo.Consumo.Fecha,
> > > > > > dbo.Consumo.ClienteID,
> > > > > > > > dbo.Consumo.Mes, dbo.Consumo.Año, dbo.Consumo.Reactiva,
> > > > > > > > dbo.Consumo.Energia
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > Vista de Consumo
> > > > > > > >
> > > > > > > >
> > > > > > > > CREATE TABLE [dbo].[Consumo] (
> > > > > > > > [ConsumoID] [int] IDENTITY (1, 1) NOT NULL ,
> > > > > > > > [ClienteID] [int] NOT NULL ,
> > > > > > > > [Fecha] [datetime] NOT NULL ,
> > > > > > > > [Energia] [decimal](18, 2) NULL ,
> > > > > > > > [Reactiva] [decimal](18, 2) NULL ,
> > > > > > > > [Potencia] [decimal](18, 2) NULL ,
> > > > > > > > [Potencia_punta] [decimal](18, 2) NULL ,
> > > > > > > > [Mes] AS (case (datepart(month,[fecha])) when '01' then
> 'Enero'
> > > > when
> > > > > > '02'
> > > > > > > > then 'Febrero' when '03' then 'Marzo' when '04' then


'Abril'
> > when
> > > > '05'
> > > > > > > then
> > > > > > > > 'Mayo' when '06' then 'Junio' when '07' then 'Julio' when
'08'
> > > then
> > > > > > > 'Agosto'
> > > > > > > > when '09' then 'Septiembre' when '10' then 'Octubre' when
'11'
> > > then
> > > > > > > > 'Noviembre' when '12' then 'Diciembre' end) ,
> > > > > > > > [Año] AS (datename(year,[fecha])) ,
> > > > > > > > [FechaInsertacion] [datetime] NULL ,
> > > > > > > > [Usuario] [varchar] (50) COLLATE
SQL_Latin1_General_CP1_CI_AS
> > > NULL
> > > > > > > > ) ON [PRIMARY]
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>


Respuesta Responder a este mensaje
#10 Julio
24/08/2004 - 20:37 | Informe spam
Gracias Liliana por tu paciencia, en el caso que no exista nada en la tabla
entonces yo necesitaria tener el valor que se inserto ya que eso es lo que
se la facturara
"Liliana Sorrentino" wrote in message
news:
Hola Julio,
Con la tabla vacía, hacés un INSERT, y es lógico que devuelva NULL, porque
no tiene nada en los meses anteriores para esta cuenta.
Cambié el código para que te devuelva 0 en lugar de NULL en la consulta, y
también en el UPDATE.
La fecha de la parámetro debería ser la de la última incorporación de


datos
en la tabla.

SELECT Consumo.Fecha, Consumo.Cliente,
Promedio = ISNULL(AVG(C2.Potencia),0)
FROM Consumo
LEFT JOIN
(SELECT TOP 2 Cliente, Potencia
FROM Consumo
WHERE fecha BETWEEN dateadd(yy, -1, @fecha) AND dateadd(dd, -1, @fecha)
ORDER BY Potencia DESC) C2
ON C2.Cliente = Consumo.Cliente
WHERE Consumo.Fecha >= @fecha
GROUP BY Consumo.Fecha, Consumo.Cliente

UPDATE Consumo
SET potencia = CASE WHEN Potencia < ISNULL(Promedio,0) THEN Promedio


END
FROM
(SELECT Cliente, Promedio = AVG(C2.Potencia)
FROM
(SELECT TOP 2 Cliente, Potencia
FROM Consumo
WHERE Fecha BETWEEN dateadd(yy, -1, @fecha) AND dateadd(dd, -1, @fecha)
ORDER BY Potencia DESC) C2
GROUP BY Cliente) C3
WHERE Fecha >= @fecha
AND C3.Cliente = Consumo.Cliente

SELECT * FROM consumo

"Julio" escribió en el mensaje
news:
> Hola, Cuando corro el el ejemplo que me enviaste aiendo un insert uno


por
> uno, estoy teneiendo un problema y es el siguiente:
>
> Cuando inserto : INSERT consumo SELECT 1, '20040824', 25
>
> luego corro el codigo:
>
> DECLARE @fecha datetime
> SET @fecha = '20040824'
>
> SELECT Consumo.Fecha, Consumo.Cliente,
> Promedio = AVG(C2.Potencia)
> FROM Consumo
> LEFT JOIN
> (SELECT TOP 2 Cliente, Potencia
> FROM Consumo
> WHERE fecha BETWEEN dateadd(yy, -1, @fecha) AND dateadd(dd, -1,


@fecha)
> ORDER BY Potencia DESC) C2
> ON C2.Cliente = Consumo.Cliente
> WHERE Consumo.Fecha >= @fecha
> GROUP BY Consumo.Fecha, Consumo.Cliente
>
> UPDATE Consumo
> SET potencia = CASE WHEN Potencia < Promedio THEN Promedio END
> FROM
> (SELECT Cliente, Promedio = AVG(C2.Potencia)
> FROM
> (SELECT TOP 2 Cliente, Potencia
> FROM Consumo
> WHERE Fecha BETWEEN dateadd(yy, -1, @fecha) AND dateadd(dd, -1,


@fecha)
> ORDER BY Potencia DESC) C2
> GROUP BY Cliente) C3
> WHERE Fecha >= @fecha
> AND C3.Cliente = Consumo.Cliente
>
> El resultado me lo trae NULL
>
>
> Una pregunta, la fecha del parametro debe ser igual a la fecha de la
> lectura?
>
>
>
>
>
> "Liliana Sorrentino" wrote in message
> news:%
> > Julio,
> > cambiá la fecha de la parámetro por '20040823', se supone que es la
última
> > fecha en que se corrió el DTS.
> >
> > "Julio" escribió en el mensaje
> > news:
> > > Saludos, en cuando a los del top 12 solo hacia referencia a esto


pero
no
> > es
> > > que lo tengo implementado.
> > > Estoy tratando de ajustar el codigo y todavia no lo logro. Con la
nueva
> > > actualizacion que me dijiste en la cual se incluia el Between me


trae
el
> > > resultado en NULL
> > > En cuanto a la fecha de insertacion es solo para llevar una


referencia
> > > cuando se corrio el DTS.
> > >
> > > Asi quedo el codigo que me dijiste.
> > >
> > > DECLARE @fecha datetime
> > > SET @fecha = '20030823'
> > >
> > > SELECT Consumo.Fecha, Consumo.Cliente,
> > > Promedio = AVG(C2.Potencia)
> > > FROM Consumo
> > > LEFT JOIN
> > > (SELECT TOP 2 Cliente, Potencia
> > > FROM Consumo
> > > WHERE fecha BETWEEN dateadd(yy, -1, @fecha) AND dateadd(dd, -1,
> @fecha)
> > > ORDER BY Potencia DESC) C2
> > > ON C2.Cliente = Consumo.Cliente
> > > WHERE Consumo.Fecha >= @fecha
> > > GROUP BY Consumo.Fecha, Consumo.Cliente
> > >
> > > UPDATE Consumo
> > > SET potencia = CASE WHEN Potencia < Promedio THEN Promedio END
> > > FROM
> > > (SELECT Cliente, Promedio = AVG(C2.Potencia)
> > > FROM
> > > (SELECT TOP 2 Cliente, Potencia
> > > FROM Consumo
> > > WHERE Fecha BETWEEN dateadd(yy, -1, @fecha) AND dateadd(dd, -1,
> @fecha)
> > > ORDER BY Potencia DESC) C2
> > > GROUP BY Cliente) C3
> > > WHERE Fecha >= @fecha
> > > AND C3.Cliente = Consumo.Cliente
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > > "Liliana Sorrentino" wrote in


message
> > > news:e5$
> > > > En mi propuesta uso la fecha por parámetro entre otras cosas para
> evitar
> > > una
> > > > subconsulta más para tomar los últimos 12.
> > > > Por ejemplo:
> > > > Si ayer agregaste la última lectura de cada cliente a la tabla,
> tendrás
> > > que
> > > > tomar las 12 lecturas ANTERIORES a la fecha de ayer.
> > > > Veo que hay una "fecha de insertación", e imagino que se


actualizará
> > > > justamente con 2004/08/23.
> > > > El query que te propongo toma las dos mayores potencias desde ayer
> hasta
> > > un
> > > > año antes, o sea 2003/08/23, y ahora que lo veo, hay un error en


el
> > > código.
> > > > Donde dice:
> > > > WHERE Fecha > dateadd(yy, -1, @fecha)
> > > > debe decir
> > > > WHERE Fecha BETWEEN dateadd(yy, -1, @fecha) AND dateadd(dd, -1,
> @fecha)
> > > > esto es para que no tome la última lectura.
> > > >
> > > > Para integrarlo a tu código necesitaría que nos muestres el


UPDATE,
yo
> > no
> > > sé
> > > > si no estaré viendo algún mensaje tuyo, pero no encuentro el TOP


12
al
> > que
> > > > hacés mención.
> > > > En mi propuesta no hay vista, es solo el UPDATE leyendo y
actualizando
> > > sobre
> > > > la misma tabla, ¿probaste lo que te envié con mis ejemplos?
¿funciona
> > como
> > > > necesitás?
> > > >
> > > > "Julio" escribió en el mensaje
> > > > news:
> > > > > Hola Liliana, Lo de la fecha no lo tenia contenplado ya que no
> > > necesitaba
> > > > de
> > > > > esto, lo que pensaba era hacer un select top 12 por usuario y
crear
> > una
> > > > > vista con esto para luego trabajar con ella.
> > > > >
> > > > > Nota: El usuario solo tendra un solo consumo por mes por eso


puse
el
> > > > select
> > > > > top 12 .
> > > > >
> > > > > Ya entiendo lo que a hecho en todo el query que me enviaste pero
no
> he
> > > > > podido integrarlo al codigo mio que fueron las dos tablas que
envie
> > para
> > > > > poder salir de esto que no me deja tranquilo.
> > > > >
> > > > > Como te decia lo que sucede es que antes solo se queria la


maxima
> > > potencia
> > > > y
> > > > > ahora tiene que ser una relacion de las dos mas grandes en los
> ultimos
> > > 12
> > > > > meses y compararlo con la que se inserto para ver cual se
mantendra.
> > > > >
> > > > > Si puede ayudarme a integrarlo al codigo mio te lo agradecere.
> > > > >
> > > > > Gracias.
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > "Liliana Sorrentino" wrote in
> message
> > > > > news:
> > > > > > Julio,
> > > > > > Creo que lo que te mandé hace eso justamente, como


comprenderás,
> no
> > es
> > > > > fácil
> > > > > > probar lo desconocido, por eso te mandé todo un juego para que
las
> > > > pruebas
> > > > > > las hagas vos y nos digas en qué no funciona.
> > > > > > Te explico lo que hace el UPDATE, y por supuesto puede haber
> mejores
> > > > > formas:
> > > > > >


asumo
> que
> > lo
> > > > > > manejás así.


menor
> que
> > > el
> > > > > > promedio calculado, toma el promedio
> > > > > > UPDATE Consumo
> > > > > > SET potencia = CASE WHEN Potencia < Promedio THEN Promedio
END
> > > > > > FROM
> > > > > > - calcula el promedio de las potencias seleccionadas para
cada
> > > > cliente
> > > > > > (SELECT Cliente, Promedio = AVG(C2.Potencia)
> > > > > > FROM
> > > > > > - toma las dos mayores potencias por c/cliente cuando la
fecha
> > está
> > > > > > dentro del último año según parámetro
> > > > > > (SELECT TOP 2 Cliente, Potencia
> > > > > > FROM Consumo
> > > > > > WHERE Fecha > dateadd(yy, -1, @fecha)
> > > > > > ORDER BY Potencia DESC) C2
> > > > > > GROUP BY Cliente) C3
> > > > > > WHERE Fecha >= @fecha
> > > > > > AND C3.Cliente = Consumo.Cliente
> > > > > >
> > > > > > Saludos... Liliana.
> > > > > >
> > > > > >
> > > > > > "Julio" escribió en el mensaje
> > > > > > news:
> > > > > > > Gracias por responder, yo tengo creado el sistema completo


lo
> que
> > > > > necesito
> > > > > > > es sustituir la parte que dice Max(Potencia) por el Query


que
me
> > > > > devuelva
> > > > > > el
> > > > > > > promedio o lo que se inserto en ese momento, es decir el que
sea
> > > > mayor.
> > > > > > >
> > > > > > > Si el promedio es mayor que se mantenga el promedio y si lo
que
> se
> > > > > inserto
> > > > > > > es mayor que mantenga el valor que se inserto.
> > > > > > >
> > > > > > > El codigo que me envias lo estuve observando pero hay sierta
> cosas
> > > que
> > > > > no
> > > > > > > entiendo en el query.
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > "Liliana Sorrentino" wrote


in
> > > message
> > > > > > > news:OlRGB%
> > > > > > > > Hola Julio,
> > > > > > > > En una versión MUY simplificada, fijate si es algo así lo
que
> > > > > necesitás.
> > > > > > > > Liliana.
> > > > > > > >
> > > > > > > > CREATE TABLE consumo
> > > > > > > > (cliente smallint,
> > > > > > > > fecha datetime,
> > > > > > > > potencia smallint)
> > > > > > > > INSERT consumo SELECT 1, '20030823', 25000
> > > > > > > > INSERT consumo SELECT 1, '20031020', 1
> > > > > > > > INSERT consumo SELECT 1, '20031120', 10
> > > > > > > > INSERT consumo SELECT 1, '20031220', 100
> > > > > > > > INSERT consumo SELECT 1, '20040120', 1000
> > > > > > > > INSERT consumo SELECT 1, '20040220', 10000
> > > > > > > > INSERT consumo SELECT 1, '20040320', 20000
> > > > > > > > INSERT consumo SELECT 1, '20040823', 200
> > > > > > > >
> > > > > > > > create index consumo on consumo (cliente, fecha)
> > > > > > > > create index consumo_f on consumo (fecha, cliente)
> > > > > > > >
> > > > > > > > SELECT * FROM consumo
> > > > > > > >
> > > > > > > > DECLARE @fecha datetime
> > > > > > > > SET @fecha = '20040823'
> > > > > > > >
> > > > > > > > SELECT Consumo.Fecha, Consumo.Cliente,
> > > > > > > > Promedio = AVG(C2.Potencia)
> > > > > > > > FROM Consumo
> > > > > > > > LEFT JOIN
> > > > > > > > (SELECT TOP 2 Cliente, Potencia
> > > > > > > > FROM Consumo
> > > > > > > > WHERE Fecha > dateadd(yy, -1, @fecha)
> > > > > > > > ORDER BY Potencia DESC) C2
> > > > > > > > ON C2.Cliente = Consumo.Cliente
> > > > > > > > WHERE Consumo.Fecha >= @fecha
> > > > > > > > GROUP BY Consumo.Fecha, Consumo.Cliente
> > > > > > > >
> > > > > > > > UPDATE Consumo
> > > > > > > > SET potencia = CASE WHEN Potencia < Promedio THEN
Promedio
> > END
> > > > > > > > FROM
> > > > > > > > (SELECT Cliente, Promedio = AVG(C2.Potencia)
> > > > > > > > FROM
> > > > > > > > (SELECT TOP 2 Cliente, Potencia
> > > > > > > > FROM Consumo
> > > > > > > > WHERE Fecha > dateadd(yy, -1, @fecha)
> > > > > > > > ORDER BY Potencia DESC) C2
> > > > > > > > GROUP BY Cliente) C3
> > > > > > > > WHERE Fecha >= @fecha
> > > > > > > > AND C3.Cliente = Consumo.Cliente
> > > > > > > >
> > > > > > > > SELECT * FROM consumo
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > "Julio" escribió en el mensaje
> > > > > > > > news:
> > > > > > > > > Hola grupo
> > > > > > > > >
> > > > > > > > > Tengo un problema con algo aqui y quisiera ver si me
pueden
> > dar
> > > > una
> > > > > > mano
> > > > > > > > con
> > > > > > > > > esto.
> > > > > > > > >
> > > > > > > > > Tengo una tabla llamada Consumo la cual es alimentada


por
un
> > DTS
> > > > que
> > > > > > > > > introduce todos los datos en ellas, tengo un caso y es


el
> > > > siguiente.
> > > > > > > > > Cada vez que se haga un insert en la tabla consumo el
campo
> > que
> > > > dice
> > > > > > > > > Potencia de la tabla Consumo sera igual al average de


las
> dos
> > > > > potencia
> > > > > > > mas
> > > > > > > > > alta durante los ultimos 12 meses que han pasado en el
caso
> > que
> > > > esta
> > > > > > > sean
> > > > > > > > > mayor que la potencia que se inserto, en caso de ser


menor
> se
> > > > queda
> > > > > la
> > > > > > > > > potencia que se inserto.
> > > > > > > > >
> > > > > > > > > entonces en la tabla consumo se hace todo el insert sin
> hacer
> > > > > ninguna
> > > > > > > > > comparacion es decir el campo potencia se inserta tal


como
> > > viene,
> > > > > > luego
> > > > > > > > creo
> > > > > > > > > una vista llamada ConsumoAP para hacer los calculos.
> > > > > > > > >
> > > > > > > > > Para que se pueda entende mejor este proyecto es para
> facturar
> > > la
> > > > > > > energia
> > > > > > > > > electrica consumida por un usuario,como ya saben todos


los
> > meses
> > > > se
> > > > > le
> > > > > > > > cobra
> > > > > > > > > lo que consumieron y si la potencia que consumieron es
mayor
> > que
> > > > las
> > > > > > dos
> > > > > > > > mas
> > > > > > > > > alta en los ultimos doces meses entonces se le cobra


esa,
de
> > lo
> > > > > > contario
> > > > > > > > se
> > > > > > > > > le cobraria el average.
> > > > > > > > >
> > > > > > > > > Al principio el campo Potencia se tenia que extraer la
> maxima
> > > que
> > > > > asi
> > > > > > es
> > > > > > > > que
> > > > > > > > > estas esta vista.
> > > > > > > > >
> > > > > > > > >
> > > > > > > > > SELECT dbo.Consumo.ConsumoID, dbo.Consumo.Fecha,
> > > > > > > > dbo.Consumo.ClienteID,
> > > > > > > > > dbo.Consumo.Mes, dbo.Consumo.Año, dbo.Consumo.Reactiva,
> > > > > > > > > dbo.Consumo.Energia, MAX(C2.Fecha)
AS
> > > > > > > > > FechaConsumoAnterior,
> > > > > > > > > (SELECT MAX(Potencia)
> > > > > > > > > <-Esta parte es la que
quiero
> > > > > sustituir
> > > > > > > por
> > > > > > > > el
> > > > > > > > > average
> > > > > > > > > FROM Consumo C2
> > > > > > > > > WHERE C2.Clienteid > > > > > > > Consumo.ClienteId)
> > > > > > > > AS
> > > > > > > > > Max_Potencia,
> > > > > > > > > (SELECT


MAX(Potencia_Punta)
> > > > > > > > > FROM Consumo C2
> > > > > > > > > WHERE C2.Clienteid > > > > > > > Consumo.ClienteId)
> > > > > > > > AS
> > > > > > > > > Max_PotenciaPunta
> > > > > > > > > FROM dbo.Consumo LEFT OUTER JOIN
> > > > > > > > > dbo.Consumo C2 ON
> dbo.Consumo.ClienteID
> > > > > > > > > > > C2.ClienteID
> > > > > > > > > AND dbo.Consumo.Fecha > C2.Fecha
> > > > > > > > > GROUP BY dbo.Consumo.ConsumoID, dbo.Consumo.Fecha,
> > > > > > > dbo.Consumo.ClienteID,
> > > > > > > > > dbo.Consumo.Mes, dbo.Consumo.Año, dbo.Consumo.Reactiva,
> > > > > > > > > dbo.Consumo.Energia
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > > > Vista de Consumo
> > > > > > > > >
> > > > > > > > >
> > > > > > > > > CREATE TABLE [dbo].[Consumo] (
> > > > > > > > > [ConsumoID] [int] IDENTITY (1, 1) NOT NULL ,
> > > > > > > > > [ClienteID] [int] NOT NULL ,
> > > > > > > > > [Fecha] [datetime] NOT NULL ,
> > > > > > > > > [Energia] [decimal](18, 2) NULL ,
> > > > > > > > > [Reactiva] [decimal](18, 2) NULL ,
> > > > > > > > > [Potencia] [decimal](18, 2) NULL ,
> > > > > > > > > [Potencia_punta] [decimal](18, 2) NULL ,
> > > > > > > > > [Mes] AS (case (datepart(month,[fecha])) when '01' then
> > 'Enero'
> > > > > when
> > > > > > > '02'
> > > > > > > > > then 'Febrero' when '03' then 'Marzo' when '04' then
'Abril'
> > > when
> > > > > '05'
> > > > > > > > then
> > > > > > > > > 'Mayo' when '06' then 'Junio' when '07' then 'Julio'


when
> '08'
> > > > then
> > > > > > > > 'Agosto'
> > > > > > > > > when '09' then 'Septiembre' when '10' then 'Octubre'


when
> '11'
> > > > then
> > > > > > > > > 'Noviembre' when '12' then 'Diciembre' end) ,
> > > > > > > > > [Año] AS (datename(year,[fecha])) ,
> > > > > > > > > [FechaInsertacion] [datetime] NULL ,
> > > > > > > > > [Usuario] [varchar] (50) COLLATE
> SQL_Latin1_General_CP1_CI_AS
> > > > NULL
> > > > > > > > > ) ON [PRIMARY]
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>


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