SQL Server 2008:运行总计和空记录

时间:2019-10-09 16:03:27

标签: sql sql-server-2008

我有几个查询可以从我们的ERP获取帐户余额,但是我想解决一些问题,我很好奇是否有更好的方法,或者SQL Server的最新版本是否具有解决这些问题的功能。问题。

  • 我们的ERP仅在与帐户相关联的活动期间才生成余额记录。 ERP应用程序和报告按时间段汇总值,但没有记录添加到数据库,因此需要按时间段平衡的自定义流程需要查询/视图来计算此信息。

    为此,我的解决方法是使用全局变量故意从我创建的Account表和伪周期表中创建重复项,请参见下文

  • 我们的“帐户期间”表中不包含期间索引(我想它应该是“行ID”,但是在某个时候错误地添加了会计期间,并且索引被乱序了。 ERP提供商在没有完全重新实现的情况下不更新此信息。我为此创建了一个解决方法表。

因此,我有几个可以解决这些问题的查询,但是它们在少数几个帐户中运行缓慢,因此至少对于我的方法而言,完整的帐户余额伪表并不可行。

下面提供了一个示例,该示例用于计算未汇总为年度未分配利润(资产,负债,权益)的帐户的期间余额。

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

任何可能改善此查询性能的建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

我的高级建议如下:

  • 避免使用IN子句。如果可能的话(假设帐户表不太大,只为需要的列创建一个临时表,并使用您正在使用的ID加载该数据。)然后在上面的代码中使用它。

  • (不是性能问题,更多的是细微的变化)。仅由于您具有“ A3.TYPE IN('e','r')THEN NULL”,才需要ISNULL(SUM ...部分。)如果您说过THEN 0,则可以避免进行空检查。

  • select中的相关子查询是可以的,但是它的多部分联接很可能导致它变慢。我不确定100%是否可以将其分解为两个单独的逻辑数据然后再结合在一起,但是这是我在这里看到的最好的信息。

相关问题