Totales acumulados SQL 2008 y nulos Records

votos
0

Tengo varias consultas que reciben los saldos de cuenta de nuestro ERP embargo, hay varias cuestiones que estoy tratando de evitar y estoy ansioso por ver si hay mejores maneras o si las versiones más recientes del servidor SQL tener funciones para hacer frente a cualquiera de estos problemas.

  • Nuestro ERP genera un registro de equilibrio sólo en períodos donde hay actividad asociada a la cuenta. Las aplicaciones ERP y informes resumen los valores por período, pero no se añade registro a la base de datos para procesos personalizados que necesitan un equilibrio por periodo requieren una consulta / vista para calcular esta información. Mi solución para esto ha sido la de utilizar una variable global para crear intencionalmente duplicados de la tabla de cuentas y la mesa periodo psudo creé, ver más abajo.
  • la dosis nuestra mesa Período cuenta no contiene un índice de tiempo (supongo que debe ser el ID de fila sin embargo, en algún momento se añadió un período fiscal incorrectamente y el índice fue expulsado de la orden. Se me ha informado por el proveedor de ERP no actualizar esta sin una reimplementación completa). He creado una tabla de solución para esto.

Así que tengo varias consultas que trabajan en torno a estas cuestiones, pero que corren slowley con sólo un puñado de cuentas para una mesa psudo completo para los saldos de cuenta no ha sido práctico con mis métodos de por lo menos. He incluido un ejemplo a continuación para calcular el balance por periodo para las cuentas que no se resumen a los resultados acumulados anualmente (activos, libalities, la equidad)

SELECT ID AS ACCOUNT_ID, ind.Month_Index, ind.Period,

       (
        SELECT ISNULL(SUM(CASE WHEN A3.TYPE IN ('e','r') THEN NULL
                               WHEN A3.TYPE = 'a' THEN ISNULL(AB3.DEBIT_AMOUNT,0) - ISNULL(AB3.CREDIT_AMOUNT,0) 
                               ELSE ISNULL(AB3.CREDIT_AMOUNT,0) - ISNULL(AB3.DEBIT_AMOUNT,0) END),0)

        FROM ACCOUNT_BALANCE AS AB3
        LEFT OUTER JOIN ACCOUNT AS A3
        ON AB3.ACCOUNT_ID = A3.ID
        LEFT OUTER JOIN (
                         SELECT YEAR, Month_Num, Month_Index, Period
                         FROM UFC_Calander 
                         GROUP BY YEAR, Month_Num, Month_Index, Period
                        ) AS ind2
        ON AB3.ACCT_YEAR = ind2.YEAR AND AB3.ACCT_PERIOD = ind2.Month_Num
        WHERE A.ID = AB3.ACCOUNT_ID AND A3.CURRENCY_ID = '(USA) $' AND ind2.Month_Index <= ind.Month_Index
       ) AS BALANCE_AQL

FROM ACCOUNT AS A
LEFT OUTER JOIN ACCOUNT_PERIOD AS per
ON 'UCC' = per.SITE_ID
LEFT OUTER JOIN ACCOUNT_BALANCE AS AB
ON A.ID = AB.ACCOUNT_ID AND per.ACCT_YEAR = AB.ACCT_YEAR AND per.ACCT_PERIOD = AB.ACCT_PERIOD AND AB.CURRENCY_ID = '(USA) $'
LEFT OUTER JOIN (
                 SELECT YEAR, Month_Num, Month_Index, Period
                 FROM UFC_Calander 
                 GROUP BY YEAR, Month_Num, Month_Index, Period
                 ) AS ind
ON per.ACCT_YEAR = ind.YEAR AND per.ACCT_PERIOD = ind.Month_Num

WHERE ID IN  ('120-1140-0000','120-1190-1190','120-1190-1193','120-1190-1194','210-2100-0000','210-2101-0000') 

GROUP BY ID, ind.Month_Index, ind.Period

ORDER BY ind.Month_Index DESC, ACCOUNT_ID DESC

Cualquier sugerencias que podrían mejorar el rendimiento de esta consulta será apreciado considerablemente.

Publicado el 09/10/2019 a las 19:03
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
0

Mis recomendaciones de alto nivel son los siguientes:

  • Evitar el uso de la cláusula IN. Si es posible (suponiendo que la tabla de cuentas no es demasiado grande, crear una tabla temporal para sólo las columnas que necesita y cargar esos datos con el ID de que está trabajando.) A continuación, el uso que en su código de seguridad.

  • (No es una cosa rendimiento, sino más bien un ligero cambio). El ISNULL (SUMA ... parte sólo es necesaria debido a que tener un "A3.TYPE IN ( 'e', ​​'r') un valor nulo". Si hubieras dicho ENTONCES 0, podría evitar el cheque nulo.

  • Una consulta correlacionada dentro del selecto está bien, pero es una de varias partes se unen a que es más probable haciendo que reducir la velocidad. No estoy seguro 100% seguros de cómo se puede romper este, aparte de ser dos cucharas lógicas independientes de datos y luego se unieron de nuevo juntos, pero su lo mejor que tengo con lo que estoy viendo aquí.

Respondida el 09/10/2019 a las 23:16
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more