Principales respuestas
Como ejecutar un script dándole distintos valores a un parámetro

Pregunta
-
Hola,
Trabajo con SQL Server 2014 y me ha surgido el siguiente problema:
Resulta que tengo el siguiente script:
select distinct idindice from Relacion_Activos_Indices where IdIndice<>0
El cual me arroja los siguientes valores:
4
3286
3287
3303
4214
4218
4233
4234
4270Pues bien, resulta que necesito ejecutar el siguiente script una vez para cada uno de los valores obtenidos en el anterior script. Como veis es un script que calcula una serie de valores y los inserta en otra tabla.
WITH R1 AS ( SELECT dbo.Relacion_Activos_Indices.idactivo, dbo.Relacion_Activos_Indices.IdIndice, dbo.DATA.Fecha, dbo.DATA.Close1, LAG(close1, 1) OVER (PARTITION BY DATA.IdActivo ORDER BY fecha,dbo.Relacion_Activos_Indices.idactivo) as preciopasado FROM dbo.Relacion_Activos_Indices INNER JOIN dbo.DATA ON dbo.Relacion_Activos_Indices.IdActivo = dbo.DATA.IdActivo INNER JOIN dbo.Activos ON dbo.Relacion_Activos_Indices.IdActivo = dbo.Activos.IdActivo INNER JOIN dbo.Activos AS Activos_1 ON dbo.Relacion_Activos_Indices.IdIndice = Activos_1.IdActivo WHERE (dbo.Activos.IdTipoActivo = '1') AND Idindice=--- CADA UNO DE LOS VALORES OBTENIDOS EN EL SELECT DISTINCT---- AND FECHA BETWEEN '01/01/1900' AND '31/12/2020' MERGE DATA AS Destino USING (SELECT idindice, Fecha, COUNT(idactivo) AS [Cuenta], '1D' AS [Periodo] FROM R1 WHERE (Close1 > PRECIOPASADO) and idindice<>0 GROUP BY Fecha,idindice ) AS Origen ON (Destino.IdActivo = [dbo].[BuscarIdActivoAmplitudporIdIndice](IdIndice,'ADV') AND Destino.Fecha = Origen.Fecha AND Destino.Periodo = Origen.Periodo) WHEN NOT MATCHED THEN INSERT (IdActivo, Periodo, Fecha, Open1, High, Low, Close1, Volumen, OpenInterest) VALUES ([dbo].[BuscarIdActivoAmplitudporIdIndice](IdIndice,'ADV'), Origen.Periodo, Origen.Fecha, Origen.Cuenta, Origen.Cuenta, Origen.Cuenta, Origen.Cuenta, NULL, NULL) WHEN MATCHED THEN UPDATE SET Open1 = Origen.Cuenta, High = Origen.Cuenta, Low = Origen.Cuenta, Close1 = Origen.Cuenta; GO
He probado a utilizar lo siguiente, es decir,
AND Idindice in(select distinct idindice from Relacion_Activos_Indices where IdIndice<>0)
pero los resultados que obtengo son totalmente distintos a los que obtengo si indico los valores uno por uno.
WITH R1 AS ( SELECT dbo.Relacion_Activos_Indices.idactivo, dbo.Relacion_Activos_Indices.IdIndice, dbo.DATA.Fecha, dbo.DATA.Close1, LAG(close1, 1) OVER (PARTITION BY DATA.IdActivo ORDER BY fecha,dbo.Relacion_Activos_Indices.idactivo) as preciopasado FROM dbo.Relacion_Activos_Indices INNER JOIN dbo.DATA ON dbo.Relacion_Activos_Indices.IdActivo = dbo.DATA.IdActivo INNER JOIN dbo.Activos ON dbo.Relacion_Activos_Indices.IdActivo = dbo.Activos.IdActivo INNER JOIN dbo.Activos AS Activos_1 ON dbo.Relacion_Activos_Indices.IdIndice = Activos_1.IdActivo WHERE (dbo.Activos.IdTipoActivo = '1') AND Idindice in(select distinct idindice from Relacion_Activos_Indices where IdIndice<>0) AND FECHA BETWEEN '01/01/1900' AND '31/12/2020' MERGE DATA AS Destino USING (SELECT idindice, Fecha, COUNT(idactivo) AS [Cuenta], '1D' AS [Periodo] FROM R1 WHERE (Close1 > PRECIOPASADO) and idindice<>0 GROUP BY Fecha,idindice ) AS Origen ON (Destino.IdActivo = [dbo].[BuscarIdActivoAmplitudporIdIndice](IdIndice,'ADV') AND Destino.Fecha = Origen.Fecha AND Destino.Periodo = Origen.Periodo) WHEN NOT MATCHED THEN INSERT (IdActivo, Periodo, Fecha, Open1, High, Low, Close1, Volumen, OpenInterest) VALUES ([dbo].[BuscarIdActivoAmplitudporIdIndice](IdIndice,'ADV'), Origen.Periodo, Origen.Fecha, Origen.Cuenta, Origen.Cuenta, Origen.Cuenta, Origen.Cuenta, NULL, NULL) WHEN MATCHED THEN UPDATE SET Open1 = Origen.Cuenta, High = Origen.Cuenta, Low = Origen.Cuenta, Close1 = Origen.Cuenta; GO
¿alguna idea de cómo resolverlo?
Muchas gracias
Angel
martes, 12 de enero de 2016 22:32
Respuestas
-
Saludos,
Unos consejos, usa siempre alias cuando armes tus querys y mejora la identación, así es más fácil de leer y dar mantenimiento a tu query.
Ejm:
SELECT rai.idactivo, rai.IdIndice, d.Fecha, d.Close1, --...-- FROM dbo.Relacion_Activos_Indices rai INNER JOIN dbo.DATA d ON rai.IdActivo = d.IdActivo INNER JOIN ---...--
En tu select de selección de Id, también asigna alias, puedes que sql este combinándolo con otro Id de otra tabla.
select distinct rai2.idindice from Relacion_Activos_Indices rai2 where rai2.IdIndice<>0
Además no veo necesidad de hacer un subquery para indicarle los indices, acaso en el siguiente query no te trae de por ti todos los Id de manera implícita?
ON dbo.Relacion_Activos_Indices.IdIndice = Activos_1.IdActivo
Ayacucho - Perú
Recuerda si mi solución atiende tu consulta por favor márcala como útil y como respuesta.
http://litigiouslobo.blogspot.com/
El Blog de Steve Morrison- Propuesto como respuesta Karen MalagónModerator jueves, 14 de enero de 2016 23:00
- Marcado como respuesta Angeleci lunes, 18 de enero de 2016 17:51
martes, 12 de enero de 2016 22:55