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]
 

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]







Preguntas similares