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:
Mostrar la cita
con
Mostrar la cita
creo
Mostrar la cita
cobra
Mostrar la cita
mas
Mostrar la cita
se
Mostrar la cita
que
Mostrar la cita
dbo.Consumo.ClienteID,
Mostrar la cita
el
Mostrar la cita
AS
Mostrar la cita
AS
Mostrar la cita
then
Mostrar la cita
'Agosto'
Mostrar la cita
#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%
Mostrar la cita
mas
Mostrar la cita
sean
Mostrar la cita
energia
Mostrar la cita
por
Mostrar la cita
dbo.Consumo.ClienteID,
Mostrar la cita
'02'
Mostrar la cita
#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:
Mostrar la cita
el
Mostrar la cita
mano
Mostrar la cita
luego
Mostrar la cita
dos
Mostrar la cita
contario
Mostrar la cita
es
Mostrar la cita
#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:
Mostrar la cita
fácil
Mostrar la cita
formas:
Mostrar la cita
necesito
Mostrar la cita
devuelva
Mostrar la cita
inserto
Mostrar la cita
no
Mostrar la cita
necesitás.
Mostrar la cita
potencia
Mostrar la cita
la
Mostrar la cita
ninguna
Mostrar la cita
le
Mostrar la cita
asi
Mostrar la cita
sustituir
Mostrar la cita
when
Mostrar la cita
'05'
Mostrar la cita
#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:
Mostrar la cita
de
Mostrar la cita
select
Mostrar la cita
y
Mostrar la cita
pruebas
Mostrar la cita
cliente
Mostrar la cita
mayor.
Mostrar la cita
una
Mostrar la cita
que
Mostrar la cita
siguiente.
Mostrar la cita
dice
Mostrar la cita
esta
Mostrar la cita
queda
Mostrar la cita
se
Mostrar la cita
las
Mostrar la cita
then
Mostrar la cita
then
Mostrar la cita
NULL
Mostrar la cita
Ads by Google
Search Busqueda sugerida