Alterar vista

24/04/2004 - 21:19 por Julio | Informe spam
Hola grupo

Tengo la siguiente vista:

SELECT ConsumoID, Reactiva,
Fecha, ClienteID, Energia,Mes,Año,Reactiva - ISNULL
((SELECT TOP 1 Reactiva
FROM Consumo C2
WHERE C2.clienteid = C1.clienteid AND
C2.fecha < C1.fecha ORDER BY fecha DESC), 0) AS TotalReactiva, Energia -
ISNULL
((SELECT TOP 1 Energia
FROM Consumo C2
WHERE C2.clienteid = C1.clienteid AND
C2.fecha < C1.fecha
ORDER BY fecha DESC), 0) AS total,

(Select MAx(Potencia) From Consumo C2
Where C2.Clienteid = C1.ClienteId)[Max_Potencia]
FROM dbo.Consumo C1


Esta vista me resta el valor del campo energía de un nuevo insert que se
realice y me pone el total de la resta en campo llamado total, ahora bien lo
que quiero es poder decirle que si el valor que se inserta en el campo
energía es menor que el que esta no me realice la resta si no que deje el
valor del insert nuevo



No se si con un case se puede resolver esto.

Preguntas similare

Leer las respuestas

#11 Javier Loria
26/04/2004 - 13:44 | Informe spam
Hola Julio:
Mi La idea no usar subconsultas, pero esta bien.
En cuanto a la restriccion, si es posible: o con un TRIGGER, o con una
FUNCION insertada en un CHECK.
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Julio escribio:
Hola Javier disculpa, Existe una forma de yo restringir en la tabla
consumo de que instroduzcan una fecha que sea inferior a la que
existen. Esto es para no tener problema en la base de datos con este
tipo de cosa.




"Julio" wrote in message
news:
Lo unico que hice fue agregar esto
(Select MAx(Potencia) From Consumo C2
Where C2.Clienteid = Consumo.ClienteId)[Max_Potencia]

Sustituyendo MAX(Consumo.Potencia) AS Max_Potencia

Y funciona bien



"Javier Loria" wrote in message
news:
Hola Julio:
No estoy seguro como va a afectar el GROUP BY de la vista pero
creo que si reemplazas
>>> , MAX(Consumo.Potencia) AS Max_Potencia
>>> por:
>>> , CASE WHEN Consumo.Potencia<MAX(C2.Potencia)
THEN MAX(C2.Potencia)
ELSE
Consumo.Potencia
END AS Max_Potencia
>>> Y al final de Group By agregas:
>>> , Consumo.Potencia
>>> Deberia tener el comportamiento esperado,
Suerte,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Julio escribio:
Gracias Javier por tu colaboración, solo falto un detallito, y es
que la el campo Max_potencia siempre tiene que tener el valor
máximo que tuvo un cliente, es decir si en el mes de Enero el tuvo
100 y en febrero tuvo 50 se mantendrá en 100 pero si en marzo tuvo
200 el toma el 200.



Esto fue un insert que realicé y para el clienteID 2 en enero el
tuvo 10908.711 en el mes de febrero debería tener lo mismo.



Gracias de antes manos.



ConsumoID Reactiva Fecha
ClienteID Energia Mes Año
TotalReactiva Total Max_potencia
120 2427.713 2004-01-01 00:00:00.000
2 900.000 Enero 2004 2427.713
900.000 10908.711
134 5000.713 2004-02-01 00:00:00.000
2 1500.000 Febrero 2004 2573.000
600.000 9018.25
141 1256.650 2004-03-01 00:00:00.000
1 340.560 Marzo 2004 1256.650
340.560
65.000

"Javier Loria" wrote in message
news:%
Hola Julio:
Espero que a la tercera sea la vencida:
==>>>>> CREATE VIEW ConsumoAP -- Buscar Nombre Apropiado
AS
SELECT Consumo.ConsumoID
, Consumo.Fecha
, Consumo.ClienteID
, Consumo.Mes
, Consumo.Año
, Consumo.Reactiva
, Consumo.Energia
, MAX(C2.Fecha) AS FechaConsumoAnterior
, MAX(Consumo.Potencia) AS Max_Potencia
FROM Consumo
LEFT JOIN Consumo AS C2
ON Consumo.ClienteIdÂ.ClienteID
AND Consumo.Fecha>C2.Fecha
GROUP BY Consumo.ConsumoID
, Consumo.Fecha
, Consumo.ClienteID
, Consumo.Mes
, Consumo.Año
, Consumo.Reactiva
, Consumo.Energia
==>>>>> Y la consulta:
==>>>>> SELECT ConsumoAP.ConsumoID
, ConsumoAP.Reactiva
, ConsumoAP.Fecha
, ConsumoAP.ClienteID
, ConsumoAp.Energia
, ConsumoAP.Mes
, ConsumoAP.Año
, CASE WHEN ConsumoAP.Reactiva> COALESCE(Consumo.Reactiva,
0) THEN ConsumoAP.Reactiva -
COALESCE(Consumo.Reactiva, 0) ELSE ConsumoAP.Reactiva
END AS TotalReactiva , CASE WHEN
ConsumoAP.Energia>COALESCE(Consumo.Energia,0) THEN
ConsumoAP.Energia-COALESCE(Consumo.Energia,0) ELSE
ConsumoAp.Energia END AS Total
, ConsumoAP.Max_Potencia
FROM ConsumoAP
LEFT JOIN Consumo
ON ConsumoAp.ClienteId=Consumo.ClienteID
AND ConsumoAp.FechaConsumoAnterior=Consumo.Fecha
==>>>>> A ver si esta ves, si la pego.
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

"Julio" wrote in message
news:
Javier disculpa, pero con la reactiva tambien debo hacer lo mismo
cuando se produzca la resta si es menor, al igual que la energia
"Julio" wrote in message
news:ukPZh$
Gracias javier por mantener la comunicacion,
Aqui esta el script

if exists (select * from dbo.sysobjects where id >>>>>>> object_id(N'[dbo].[FK_Facturas_Consumo]') and OBJECTPROPERTY(id,
N'IsForeignKey') = 1)
ALTER TABLE [dbo].[Facturas] DROP CONSTRAINT FK_Facturas_Consumo
GO

if exists (select * from dbo.sysobjects where id >>>>>>> object_id(N'[dbo].[Consumo]') and OBJECTPROPERTY(id,
N'IsUserTable') = 1) drop table [dbo].[Consumo]
GO

CREATE TABLE [dbo].[Consumo] (
[ConsumoID] [int] IDENTITY (1, 1) NOT NULL ,
[ClienteID] [int] NOT NULL ,
[Fecha] [datetime] NOT NULL ,
[Energia] [decimal](18, 3) NOT NULL ,
[Reactiva] [decimal](18, 3) NULL ,
[Potencia] [decimal](18, 3) NOT 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]))
) ON [PRIMARY]
GO

Este es el error que me muestra al correrlo nuevamente

Server: Msg 208, Level 16, State 1, Procedure ConsumoAP, Line 3
Invalid object name 'Consumo2'.







"Javier Loria" wrote in message
news:
Hola Julio:
Disculpa tengo varios errores:
>>>>>>>> CREATE VIEW ConsumoAP -- Buscar Nombre Apropiado
AS
SELECT Consumo.ConsumoID
, Consumo.Reactiva
, Consumo.Fecha
, Consumo.ClienteID
, Consumo.Energia
, Consumo.Mes
, Consumo.Año
, Consumo.Reactiva
, Consumo.Energia
, MAX(C2.Fecha) AS FechaConsumoAnterior
, MAX(Consumo.Potencia) AS Max_Potencia
FROM Consumo
LEFT JOIN Consumo2 AS C2
ON Consumo.ClienteIdÂ.ClienteID
AND Consumo.Fecha>C2.Fecha
GROUP BY Consumo.ConsumoID
, Consumo.Reactiva
, Consumo.Fecha
, Consumo.ClienteID
, Consumo.Energia
, Consumo.Mes
, Consumo.Año
, Consumo.Reactiva
, Consumo.Energia
>>>>>>>> Prueba a ver si te funciona la creacion de la vista, si te
falla seria mucha molestia mandarme el DDL (Create Table) de
la tabla Consumo?
Eso lo obtienes en el Query Analizer sobre la tabla y genera el
script de Create.
Creo que la consulta esta bien.
Espero te funcione,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

"Julio" wrote in message
news:
Gracias Javier por responder, cuando trato de correrlo me dice
Server: Msg 208, Level 16, State 1, Procedure ConsumoAP, Line
3 Invalid object name 'Consumo2'.

"Javier Loria" wrote in message
news:
Hola Julio:
Si si podrias, antes podrias querer eliminar las
subconsultas para evitar problemas de desempeno.
Si creas una vista, la sintaxis se simplifica:
>>>>>>>>>> CREATE VIEW ConsumoAP -- Buscar Nombre Apropiado
AS
SELECT Consumo.ConsumoID
, Consumo.Reactiva
, Consumo.Fecha
, Consumo.ClienteID
, Consumo.Energia
, Consumo.Mes
, Consumo.Año
, Consumo.Reactiva
, Consumo.Energia
, MAX(Fecha2) AS FechaConsumoAnterior
, MAX(Potencia) AS Max_Potencia
FROM Consumo C1
LEFT JOIN Consumo2 C2
ON C1.ClienteIdÂ.ClienteID
AND C1.Fecha>C2.Fecha
GROUP BY Consumo.ConsumoID
, Consumo.Reactiva
, Consumo.Fecha
, Consumo.ClienteID
, Consumo.Energia
, Consumo.Mes
, Consumo.Año
, Consumo.Reactiva
, Consumo.Energia

>>>>>>>>>> Esta vista permite luego crear la consulta como:
>>>>>>>>>> SELECT ConsumoAP.ConsumoID
, ConsumoAP.Reactiva
, ConsumoAP.Fecha
, ConsumoAP.ClienteID
, ConsumoAP.Energia
, ConsumoAP.Mes
, ConsumoAP.Año
, ConsumoAP.Reactiva -
COALESCE(Consumo.Reactiva, 0) , CASE
WHEN

ConsumoAP.Energia>COALESCE(Consumo.Energia,
0) THEN
ConsumoAP.Energia-COALESCE(Consumo.Energia, 0)
ELSE ConsumoAp.Energia END AS Total ,
ConsumoAP.Max_Potencia
FROM ConsumoAP
LEFT JOIN Consumo
ON ConsumoAp.ClienteId=Consumo.ClienteID
AND ConsumoAp.FechaConsumoAnterior=Consumo.Fecha
>>>>>>>>>> Esto asumiendo que ClienteId, Fecha son llave natural












primaria
(Unica
y
No Nulla)
Va sin probar asi que disculpa los errores de sintaxis.
Espero te sirva,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.




"Julio" wrote in message
news:
Hola grupo

Tengo la siguiente vista:

SELECT ConsumoID, Reactiva,
Fecha, ClienteID, Energia,Mes,Año,Reactiva - ISNULL
((SELECT TOP 1 Reactiva
FROM Consumo C2
WHERE C2.clienteid >>>>>>>>>>> C1.clienteid AND C2.fecha < C1.fecha ORDER BY fecha DESC),
0) AS TotalReactiva, Energia - ISNULL
((SELECT TOP 1 Energia
FROM Consumo C2
WHERE C2.clienteid >>>>>>>>>>> C1.clienteid AND C2.fecha < C1.fecha
ORDER BY fecha DESC), 0) AS
total,

(Select MAx(Potencia) From Consumo C2
Where C2.Clienteid = C1.ClienteId)[Max_Potencia]
FROM dbo.Consumo C1


Esta vista me resta el valor del campo energía de un nuevo












insert
que
se
realice y me pone el total de la resta en campo llamado
total,










ahora
bien
lo
que quiero es poder decirle que si el valor que se inserta
en el campo energía es menor que el que esta no me realice
la resta si no












que
deje
el
valor del insert nuevo



No se si con un case se puede resolver esto.
Respuesta Responder a este mensaje
#12 Julio
26/04/2004 - 13:55 | Informe spam
Ok, gracias Javier
"Javier Loria" wrote in message
news:
Hola Julio:
Mi La idea no usar subconsultas, pero esta bien.
En cuanto a la restriccion, si es posible: o con un TRIGGER, o con una
FUNCION insertada en un CHECK.
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Julio escribio:
> Hola Javier disculpa, Existe una forma de yo restringir en la tabla
> consumo de que instroduzcan una fecha que sea inferior a la que
> existen. Esto es para no tener problema en la base de datos con este
> tipo de cosa.
>
>
>
>
> "Julio" wrote in message
> news:
>> Lo unico que hice fue agregar esto
>> (Select MAx(Potencia) From Consumo C2
>> Where C2.Clienteid = Consumo.ClienteId)[Max_Potencia]
>>
>> Sustituyendo MAX(Consumo.Potencia) AS Max_Potencia
>>
>> Y funciona bien
>>
>>
>>
>> "Javier Loria" wrote in message
>> news:
>>> Hola Julio:
>>> No estoy seguro como va a afectar el GROUP BY de la vista pero
>>> creo que si reemplazas
>>> > >>> , MAX(Consumo.Potencia) AS Max_Potencia
>>> > >>> por:
>>> > >>> , CASE WHEN Consumo.Potencia<MAX(C2.Potencia)
>>> THEN MAX(C2.Potencia)
>>> ELSE
>>> Consumo.Potencia
>>> END AS Max_Potencia
>>> > >>> Y al final de Group By agregas:
>>> > >>> , Consumo.Potencia
>>> > >>> Deberia tener el comportamiento esperado,
>>> Suerte,
>>>
>>>
>>> Javier Loria
>>> Costa Rica
>>> Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
>>> que pueda ser copiado y pegado al Query Analizer.
>>> La version de SQL y Service Pack tambien ayuda.
>>> Julio escribio:
>>>> Gracias Javier por tu colaboración, solo falto un detallito, y es
>>>> que la el campo Max_potencia siempre tiene que tener el valor
>>>> máximo que tuvo un cliente, es decir si en el mes de Enero el tuvo
>>>> 100 y en febrero tuvo 50 se mantendrá en 100 pero si en marzo tuvo
>>>> 200 el toma el 200.
>>>>
>>>>
>>>>
>>>> Esto fue un insert que realicé y para el clienteID 2 en enero el
>>>> tuvo 10908.711 en el mes de febrero debería tener lo mismo.
>>>>
>>>>
>>>>
>>>> Gracias de antes manos.
>>>>
>>>>
>>>>
>>>> ConsumoID Reactiva Fecha
>>>> ClienteID Energia Mes Año
>>>> TotalReactiva Total Max_potencia
>>>> 120 2427.713 2004-01-01 00:00:00.000
>>>> 2 900.000 Enero 2004 2427.713
>>>> 900.000 10908.711
>>>> 134 5000.713 2004-02-01 00:00:00.000
>>>> 2 1500.000 Febrero 2004 2573.000
>>>> 600.000 9018.25
>>>> 141 1256.650 2004-03-01 00:00:00.000
>>>> 1 340.560 Marzo 2004 1256.650
>>>> 340.560
>>>> 65.000
>>>>
>>>> "Javier Loria" wrote in message
>>>> news:%
>>>>> Hola Julio:
>>>>> Espero que a la tercera sea la vencida:
>>>>> ==> >>>>> CREATE VIEW ConsumoAP -- Buscar Nombre Apropiado
>>>>> AS
>>>>> SELECT Consumo.ConsumoID
>>>>> , Consumo.Fecha
>>>>> , Consumo.ClienteID
>>>>> , Consumo.Mes
>>>>> , Consumo.Año
>>>>> , Consumo.Reactiva
>>>>> , Consumo.Energia
>>>>> , MAX(C2.Fecha) AS FechaConsumoAnterior
>>>>> , MAX(Consumo.Potencia) AS Max_Potencia
>>>>> FROM Consumo
>>>>> LEFT JOIN Consumo AS C2
>>>>> ON Consumo.ClienteIdÂ.ClienteID
>>>>> AND Consumo.Fecha>C2.Fecha
>>>>> GROUP BY Consumo.ConsumoID
>>>>> , Consumo.Fecha
>>>>> , Consumo.ClienteID
>>>>> , Consumo.Mes
>>>>> , Consumo.Año
>>>>> , Consumo.Reactiva
>>>>> , Consumo.Energia
>>>>> ==> >>>>> Y la consulta:
>>>>> ==> >>>>> SELECT ConsumoAP.ConsumoID
>>>>> , ConsumoAP.Reactiva
>>>>> , ConsumoAP.Fecha
>>>>> , ConsumoAP.ClienteID
>>>>> , ConsumoAp.Energia
>>>>> , ConsumoAP.Mes
>>>>> , ConsumoAP.Año
>>>>> , CASE WHEN ConsumoAP.Reactiva> COALESCE(Consumo.Reactiva,
>>>>> 0) THEN ConsumoAP.Reactiva -
>>>>> COALESCE(Consumo.Reactiva, 0) ELSE ConsumoAP.Reactiva
>>>>> END AS TotalReactiva , CASE WHEN
>>>>> ConsumoAP.Energia>COALESCE(Consumo.Energia,0) THEN
>>>>> ConsumoAP.Energia-COALESCE(Consumo.Energia,0) ELSE
>>>>> ConsumoAp.Energia END AS Total
>>>>> , ConsumoAP.Max_Potencia
>>>>> FROM ConsumoAP
>>>>> LEFT JOIN Consumo
>>>>> ON ConsumoAp.ClienteId=Consumo.ClienteID
>>>>> AND ConsumoAp.FechaConsumoAnterior=Consumo.Fecha
>>>>> ==> >>>>> A ver si esta ves, si la pego.
>>>>> Saludos,
>>>>>
>>>>> Javier Loria
>>>>> Costa Rica
>>>>> Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
>>>>> que pueda ser copiado y pegado al Query Analizer.
>>>>> La version de SQL y Service Pack tambien ayuda.
>>>>>
>>>>> "Julio" wrote in message
>>>>> news:
>>>>>> Javier disculpa, pero con la reactiva tambien debo hacer lo mismo
>>>>>> cuando se produzca la resta si es menor, al igual que la energia
>>>>>> "Julio" wrote in message
>>>>>> news:ukPZh$
>>>>>>> Gracias javier por mantener la comunicacion,
>>>>>>> Aqui esta el script
>>>>>>>
>>>>>>> if exists (select * from dbo.sysobjects where id > >>>>>>> object_id(N'[dbo].[FK_Facturas_Consumo]') and OBJECTPROPERTY(id,
>>>>>>> N'IsForeignKey') = 1)
>>>>>>> ALTER TABLE [dbo].[Facturas] DROP CONSTRAINT FK_Facturas_Consumo
>>>>>>> GO
>>>>>>>
>>>>>>> if exists (select * from dbo.sysobjects where id > >>>>>>> object_id(N'[dbo].[Consumo]') and OBJECTPROPERTY(id,
>>>>>>> N'IsUserTable') = 1) drop table [dbo].[Consumo]
>>>>>>> GO
>>>>>>>
>>>>>>> CREATE TABLE [dbo].[Consumo] (
>>>>>>> [ConsumoID] [int] IDENTITY (1, 1) NOT NULL ,
>>>>>>> [ClienteID] [int] NOT NULL ,
>>>>>>> [Fecha] [datetime] NOT NULL ,
>>>>>>> [Energia] [decimal](18, 3) NOT NULL ,
>>>>>>> [Reactiva] [decimal](18, 3) NULL ,
>>>>>>> [Potencia] [decimal](18, 3) NOT 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]))
>>>>>>> ) ON [PRIMARY]
>>>>>>> GO
>>>>>>>
>>>>>>> Este es el error que me muestra al correrlo nuevamente
>>>>>>>
>>>>>>> Server: Msg 208, Level 16, State 1, Procedure ConsumoAP, Line 3
>>>>>>> Invalid object name 'Consumo2'.
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> "Javier Loria" wrote in message
>>>>>>> news:
>>>>>>>> Hola Julio:
>>>>>>>> Disculpa tengo varios errores:
>>>>>>>> > >>>>>>>> CREATE VIEW ConsumoAP -- Buscar Nombre Apropiado
>>>>>>>> AS
>>>>>>>> SELECT Consumo.ConsumoID
>>>>>>>> , Consumo.Reactiva
>>>>>>>> , Consumo.Fecha
>>>>>>>> , Consumo.ClienteID
>>>>>>>> , Consumo.Energia
>>>>>>>> , Consumo.Mes
>>>>>>>> , Consumo.Año
>>>>>>>> , Consumo.Reactiva
>>>>>>>> , Consumo.Energia
>>>>>>>> , MAX(C2.Fecha) AS FechaConsumoAnterior
>>>>>>>> , MAX(Consumo.Potencia) AS Max_Potencia
>>>>>>>> FROM Consumo
>>>>>>>> LEFT JOIN Consumo2 AS C2
>>>>>>>> ON Consumo.ClienteIdÂ.ClienteID
>>>>>>>> AND Consumo.Fecha>C2.Fecha
>>>>>>>> GROUP BY Consumo.ConsumoID
>>>>>>>> , Consumo.Reactiva
>>>>>>>> , Consumo.Fecha
>>>>>>>> , Consumo.ClienteID
>>>>>>>> , Consumo.Energia
>>>>>>>> , Consumo.Mes
>>>>>>>> , Consumo.Año
>>>>>>>> , Consumo.Reactiva
>>>>>>>> , Consumo.Energia
>>>>>>>> > >>>>>>>> Prueba a ver si te funciona la creacion de la vista, si te
>>>>>>>> falla seria mucha molestia mandarme el DDL (Create Table) de
>>>>>>>> la tabla Consumo?
>>>>>>>> Eso lo obtienes en el Query Analizer sobre la tabla y genera el
>>>>>>>> script de Create.
>>>>>>>> Creo que la consulta esta bien.
>>>>>>>> Espero te funcione,
>>>>>>>>
>>>>>>>>
>>>>>>>> Javier Loria
>>>>>>>> Costa Rica
>>>>>>>> Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
>>>>>>>> que pueda ser copiado y pegado al Query Analizer.
>>>>>>>> La version de SQL y Service Pack tambien ayuda.
>>>>>>>>
>>>>>>>> "Julio" wrote in message
>>>>>>>> news:
>>>>>>>>> Gracias Javier por responder, cuando trato de correrlo me dice
>>>>>>>>> Server: Msg 208, Level 16, State 1, Procedure ConsumoAP, Line
>>>>>>>>> 3 Invalid object name 'Consumo2'.
>>>>>>>>>
>>>>>>>>> "Javier Loria" wrote in message
>>>>>>>>> news:
>>>>>>>>>> Hola Julio:
>>>>>>>>>> Si si podrias, antes podrias querer eliminar las
>>>>>>>>>> subconsultas para evitar problemas de desempeno.
>>>>>>>>>> Si creas una vista, la sintaxis se simplifica:
>>>>>>>>>> > >>>>>>>>>> CREATE VIEW ConsumoAP -- Buscar Nombre Apropiado
>>>>>>>>>> AS
>>>>>>>>>> SELECT Consumo.ConsumoID
>>>>>>>>>> , Consumo.Reactiva
>>>>>>>>>> , Consumo.Fecha
>>>>>>>>>> , Consumo.ClienteID
>>>>>>>>>> , Consumo.Energia
>>>>>>>>>> , Consumo.Mes
>>>>>>>>>> , Consumo.Año
>>>>>>>>>> , Consumo.Reactiva
>>>>>>>>>> , Consumo.Energia
>>>>>>>>>> , MAX(Fecha2) AS FechaConsumoAnterior
>>>>>>>>>> , MAX(Potencia) AS Max_Potencia
>>>>>>>>>> FROM Consumo C1
>>>>>>>>>> LEFT JOIN Consumo2 C2
>>>>>>>>>> ON C1.ClienteIdÂ.ClienteID
>>>>>>>>>> AND C1.Fecha>C2.Fecha
>>>>>>>>>> GROUP BY Consumo.ConsumoID
>>>>>>>>>> , Consumo.Reactiva
>>>>>>>>>> , Consumo.Fecha
>>>>>>>>>> , Consumo.ClienteID
>>>>>>>>>> , Consumo.Energia
>>>>>>>>>> , Consumo.Mes
>>>>>>>>>> , Consumo.Año
>>>>>>>>>> , Consumo.Reactiva
>>>>>>>>>> , Consumo.Energia
>>>>>>>>>>
>>>>>>>>>> > >>>>>>>>>> Esta vista permite luego crear la consulta como:
>>>>>>>>>> > >>>>>>>>>> SELECT ConsumoAP.ConsumoID
>>>>>>>>>> , ConsumoAP.Reactiva
>>>>>>>>>> , ConsumoAP.Fecha
>>>>>>>>>> , ConsumoAP.ClienteID
>>>>>>>>>> , ConsumoAP.Energia
>>>>>>>>>> , ConsumoAP.Mes
>>>>>>>>>> , ConsumoAP.Año
>>>>>>>>>> , ConsumoAP.Reactiva -
>>>>>>>>>> COALESCE(Consumo.Reactiva, 0) , CASE
>>>>>>>>>> WHEN
>>>>>>>>>>
>>>>>>>>>> ConsumoAP.Energia>COALESCE(Consumo.Energia,
>>>>>>>>>> 0) THEN
>>>>>>>>>> ConsumoAP.Energia-COALESCE(Consumo.Energia, 0)
>>>>>>>>>> ELSE ConsumoAp.Energia END AS Total ,
>>>>>>>>>> ConsumoAP.Max_Potencia
>>>>>>>>>> FROM ConsumoAP
>>>>>>>>>> LEFT JOIN Consumo
>>>>>>>>>> ON ConsumoAp.ClienteId=Consumo.ClienteID
>>>>>>>>>> AND ConsumoAp.FechaConsumoAnterior=Consumo.Fecha
>>>>>>>>>> > >>>>>>>>>> Esto asumiendo que ClienteId, Fecha son llave natural
>>>> primaria
>>>>>>>> (Unica
>>>>>>>>> y
>>>>>>>>>> No Nulla)
>>>>>>>>>> Va sin probar asi que disculpa los errores de sintaxis.
>>>>>>>>>> Espero te sirva,
>>>>>>>>>>
>>>>>>>>>> Javier Loria
>>>>>>>>>> Costa Rica
>>>>>>>>>> Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
>>>>>>>>>> que pueda ser copiado y pegado al Query Analizer.
>>>>>>>>>> La version de SQL y Service Pack tambien ayuda.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> "Julio" wrote in message
>>>>>>>>>> news:
>>>>>>>>>>> Hola grupo
>>>>>>>>>>>
>>>>>>>>>>> Tengo la siguiente vista:
>>>>>>>>>>>
>>>>>>>>>>> SELECT ConsumoID, Reactiva,
>>>>>>>>>>> Fecha, ClienteID, Energia,Mes,Año,Reactiva - ISNULL
>>>>>>>>>>> ((SELECT TOP 1 Reactiva
>>>>>>>>>>> FROM Consumo C2
>>>>>>>>>>> WHERE C2.clienteid > >>>>>>>>>>> C1.clienteid AND C2.fecha < C1.fecha ORDER BY fecha DESC),
>>>>>>>>>>> 0) AS TotalReactiva, Energia - ISNULL
>>>>>>>>>>> ((SELECT TOP 1 Energia
>>>>>>>>>>> FROM Consumo C2
>>>>>>>>>>> WHERE C2.clienteid > >>>>>>>>>>> C1.clienteid AND C2.fecha < C1.fecha
>>>>>>>>>>> ORDER BY fecha DESC), 0) AS
>>>>>>>>>>> total,
>>>>>>>>>>>
>>>>>>>>>>> (Select MAx(Potencia) From Consumo C2
>>>>>>>>>>> Where C2.Clienteid = C1.ClienteId)[Max_Potencia]
>>>>>>>>>>> FROM dbo.Consumo C1
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Esta vista me resta el valor del campo energía de un nuevo
>>>>> insert
>>>>>>> que
>>>>>>>> se
>>>>>>>>>>> realice y me pone el total de la resta en campo llamado
>>>>>>>>>>> total,
>>>>>> ahora
>>>>>>>>> bien
>>>>>>>>>> lo
>>>>>>>>>>> que quiero es poder decirle que si el valor que se inserta
>>>>>>>>>>> en el campo energía es menor que el que esta no me realice
>>>>>>>>>>> la resta si no
>>>>> que
>>>>>>> deje
>>>>>>>>> el
>>>>>>>>>>> valor del insert nuevo
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> No se si con un case se puede resolver esto.


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