locked
Como ejecutar un script dándole distintos valores a un parámetro RRS feed

  • 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
    4270

    Pues 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

    martes, 12 de enero de 2016 22:55