我有几个查询可以从我们的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
任何可能改善此查询性能的建议将不胜感激。
答案 0 :(得分:0)
我的高级建议如下:
避免使用IN子句。如果可能的话(假设帐户表不太大,只为需要的列创建一个临时表,并使用您正在使用的ID加载该数据。)然后在上面的代码中使用它。
(不是性能问题,更多的是细微的变化)。仅由于您具有“ A3.TYPE IN('e','r')THEN NULL”,才需要ISNULL(SUM ...部分。)如果您说过THEN 0,则可以避免进行空检查。
select中的相关子查询是可以的,但是它的多部分联接很可能导致它变慢。我不确定100%是否可以将其分解为两个单独的逻辑数据然后再结合在一起,但是这是我在这里看到的最好的信息。