多个子查询

hsgswve4  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(301)

我在sql server中有一个包含4个子查询的查询,我正在寻找一种优化它的方法:

DECLARE @INICIO DATE
 DECLARE @FIN DATE
 SET @INICIO='2020-06-17'
 SET @FIN='2020-07-27'

 SELECT VALO.FECHA_VALORACION,
        VALO.CODIGO_PORTAFOLIO,
        VALO.CUSIP,
        VALO.NUMERO_INVERSION,
        VALO.SM_GRUPO 
        SM_TIPO,
        VALO.TIPO_INSTRUMENTO DESCRIPCION_INSTMT,
        VALO.CODIGO_MONEDA CODIGO_MONEDA_PAGAR, 
        VALO.CODIGO_MONEDA CODIGO_MONEDA_RECIBIR,
        VALO.ID_CONTRAPARTE,
        OP.PRECIO 
        PRECIO_FX,
        VALO.VALOR_NOMINAL,
        VALO.VALOR_DERECHO,
        VALO.VALOR_OBLIGACION,
        VALO.VALOR_UTILIDAD_PERDIDA, 
        OP.FECHA FECHA_OPERACION,
        VALO.TIPO_OPERACION,
        OP.VALOR_OPERACION  VALOR_OPERACION_COP,
        OP.FECHA_VENCIMIENTO,
        VALO.SM_GRUPO,
        VALO.VALOR_UTILIDAD_PERDIDA_DER,
        VALO.VALOR_UTILIDAD_PERDIDA_OBL,
        (SELECT SUM(NESTED.VALOR_UTILIDAD_PERDIDA)
         FROM Spirit.TSPT_VALORACION_FUT NESTED 
         WHERE NESTED.CUSIP=VALO.CUSIP
           AND NESTED.CODIGO_PORTAFOLIO=VALO.CODIGO_PORTAFOLIO 
           AND FECHA_VALORACION>=dateadd(month, datediff(month, 0, @INICIO), 0)
           AND FECHA_VALORACION<=VALO.FECHA_VALORACION 
           AND VALOR_UTILIDAD_PERDIDA>0
         GROUP BY CUSIP,CODIGO_PORTAFOLIO) AS UTILIDAD_MENSUAL,
        (SELECT SUM(NESTED.VALOR_UTILIDAD_PERDIDA)
         FROM Spirit.TSPT_VALORACION_FUT NESTED 
         WHERE NESTED.CUSIP=VALO.CUSIP
           AND NESTED.CODIGO_PORTAFOLIO=VALO.CODIGO_PORTAFOLIO 
           AND FECHA_VALORACION>=dateadd(month, datediff(month, 0, @INICIO), 0)
           AND FECHA_VALORACION<=VALO.FECHA_VALORACION 
           AND VALOR_UTILIDAD_PERDIDA<0
         GROUP BY CUSIP,CODIGO_PORTAFOLIO) AS PERDIDA_MENSUAL,
        (SELECT SUM(NESTED.VALOR_UTILIDAD_PERDIDA)
         FROM Spirit.TSPT_VALORACION_FUT NESTED 
         WHERE NESTED.CUSIP=VALO.CUSIP
         AND NESTED.CODIGO_PORTAFOLIO=VALO.CODIGO_PORTAFOLIO 
           AND NESTED.FECHA_VALORACION<=VALO.FECHA_VALORACION 
           AND NESTED.VALOR_UTILIDAD_PERDIDA>0
         GROUP BY CUSIP,CODIGO_PORTAFOLIO) AS UTILIDAD_ACUMULADA,
        (SELECT SUM(NESTED.VALOR_UTILIDAD_PERDIDA)
         FROM Spirit.TSPT_VALORACION_FUT NESTED 
         WHERE NESTED.CUSIP=VALO.CUSIP
           AND NESTED.CODIGO_PORTAFOLIO=VALO.CODIGO_PORTAFOLIO 
           AND FECHA_VALORACION<=VALO.FECHA_VALORACION
           AND VALOR_UTILIDAD_PERDIDA<0
         GROUP BY CUSIP,CODIGO_PORTAFOLIO) AS PERDIDA_ACUMULADA
FROM Spirit.TSPT_VALORACION_FUT VALO 
     INNER JOIN Spirit.TSPT_OPERACIONES OP ON OP.NUMERO_INVERSION = VALO.NUMERO_INVERSION
            AND OP.TIPO_OPERACION = VALO.TIPO_OPERACION
            AND OP.SM_GRUPO IN ('OPTION') 
WHERE VALO.SM_GRUPO IN ('OPTION')
  AND VALO.CODIGO_PORTAFOLIO IN ('AFP-P','AFP-F')
  AND VALO.FECHA_VALORACION >= @INICIO
  AND VALO.FECHA_VALORACION <= @FIN
ORDER BY VALO.CUSIP,VALO.FECHA_VALORACION

但我不知道如何整合它,得到最好的。非常感谢。
这是先前优化过程的结果。
我试过这样的方法:

(SELECT sum (case when NESTED.VALOR_UTILIDAD_PERDIDA > 0 then NESTED.VALOR_UTILIDAD_PERDIDA else 0 end) as UTILIDAD_MENSUAL,
        sum (case when NESTED.VALOR_UTILIDAD_PERDIDA < 0 then  NESTED.VALOR_UTILIDAD_PERDIDA else 0 end) as PERDIDA_MENSUAL
    FROM Spirit.TSPT_VALORACION_FUT NESTED 
WHERE NESTED.CUSIP=VALO.CUSIP
  AND NESTED.CODIGO_PORTAFOLIO=VALO.CODIGO_PORTAFOLIO 
  AND FECHA_VALORACION>=dateadd(month, datediff(month, 0, @INICIO), 0) 
  AND FECHA_VALORACION<=VALO.FECHA_VALORACION 
  AND VALOR_UTILIDAD_PERDIDA>0
GROUP BY CUSIP,CODIGO_PORTAFOLIO) AS ACUMULADOS
gmol1639

gmol16391#

由于所有子查询似乎都来自同一个表,因此可以在 FROM 条款。。。试试这个。。。我真的无法调试没有表模式引用的语法。。。

DECLARE @INICIO DATE
DECLARE @FIN DATE

SET @INICIO='2020-06-17'
SET @FIN='2020-07-27'

SELECT
    VALO.FECHA_VALORACION,
    VALO.CODIGO_PORTAFOLIO,
    VALO.CUSIP,
    VALO.NUMERO_INVERSION,
    VALO.SM_GRUPO
    SM_TIPO,
    VALO.TIPO_INSTRUMENTO DESCRIPCION_INSTMT,
    VALO.CODIGO_MONEDA CODIGO_MONEDA_PAGAR,
    VALO.CODIGO_MONEDA CODIGO_MONEDA_RECIBIR,
    VALO.ID_CONTRAPARTE,
    OP.PRECIO
    PRECIO_FX,
    VALO.VALOR_NOMINAL,
    VALO.VALOR_DERECHO,
    VALO.VALOR_OBLIGACION,
    VALO.VALOR_UTILIDAD_PERDIDA,
    OP.FECHA FECHA_OPERACION,
    VALO.TIPO_OPERACION,
    OP.VALOR_OPERACION VALOR_OPERACION_COP,
    OP.FECHA_VENCIMIENTO,
    VALO.SM_GRUPO,
    VALO.VALOR_UTILIDAD_PERDIDA_DER,
    VALO.VALOR_UTILIDAD_PERDIDA_OBL,
    S.UTILIDAD_MENSUAL,
    S.PERDIDA_MENSUAL,
    S.UTILIDAD_ACUMULADA,
    S.PERDIDA_ACUMULADA
FROM
    Spirit.TSPT_VALORACION_FUT VALO
    INNER JOIN Spirit.TSPT_OPERACIONES OP ON
        OP.NUMERO_INVERSION = VALO.NUMERO_INVERSION
        AND OP.TIPO_OPERACION = VALO.TIPO_OPERACION
        AND OP.SM_GRUPO IN ('OPTION')
    OUTER APPLY (
        SELECT
            SUM(CASE WHEN FECHA_VALORACION>=dateadd(month, datediff(month, 0, @INICIO), 0) AND VALOR_UTILIDAD_PERDIDA>0
                THEN NESTED.VALOR_UTILIDAD_PERDIDA
                ELSE 0
            END) UTILIDAD_MENSUAL,

            SUM(CASE WHEN  FECHA_VALORACION>=dateadd(month, datediff(month, 0, @INICIO), 0) AND VALOR_UTILIDAD_PERDIDA<0 
                THEN NESTED.VALOR_UTILIDAD_PERDIDA
                ELSE 0
            END) PERDIDA_MENSUAL,

            SUM(CASE WHEN NESTED.VALOR_UTILIDAD_PERDIDA>0 
                THEN NESTED.VALOR_UTILIDAD_PERDIDA
                ELSE 0
            END) UTILIDAD_ACUMULADA,

            SUM(CASE WHEN VALOR_UTILIDAD_PERDIDA<0
                THEN NESTED.VALOR_UTILIDAD_PERDIDA
                ELSE 0 END
            ) PERDIDA_ACUMULADA
        FROM
            Spirit.TSPT_VALORACION_FUT NESTED
        WHERE
            FECHA_VALORACION<=VALO.FECHA_VALORACION AND 
            NESTED.CUSIP = VALO.CUSIP AND
            NESTED.CODIGO_PORTAFOLIO=VALO.CODIGO_PORTAFOLIO
        GROUP BY
            CUSIP,
            CODIGO_PORTAFOLIO
    ) S
WHERE
    VALO.SM_GRUPO IN ('OPTION')
    AND VALO.CODIGO_PORTAFOLIO IN ('AFP-P','AFP-F')
    AND VALO.FECHA_VALORACION >= @INICIO
    AND VALO.FECHA_VALORACION <= @FIN
ORDER BY
    VALO.CUSIP,
    VALO.FECHA_VALORACION

相关问题