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

#1 Liliana Sorrentino
23/08/2004 - 20:35 | Informe spam
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
#2 Julio
23/08/2004 - 22:41 | Informe spam
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
#3 Liliana Sorrentino
24/08/2004 - 14:26 | Informe spam
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í.
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
#4 Julio
24/08/2004 - 15:41 | Informe spam
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í.
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
#5 Liliana Sorrentino
24/08/2004 - 16:17 | Informe spam
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:
>
> manejás así.
> 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
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida