我有第三方数据库,其中包含我需要报告的发票数据。无论“发票”是贷项凭证还是实际发票,数量和金额字段都存储为正数。有一个字符字段包含类型“I”= Invoice,“R”= Credit。
在一份等于140万条记录的报告中,我需要对这些数据求和,以便从总数中减去Credits,并将发票添加到总数中,我需要在报告中的8个不同列中执行此操作(CurrentYear, PreviousYear等)
我的问题是表现出许多不同的方法来实现这一目标。
表现最好似乎是在等式中使用CASE语句,如下所示:
Case WHEN ARH.AccountingYear - 2 = @iCurrentYear THEN ARL.ShipQuantity * (CASE WHEN InvoiceType = 'R' THEN -1 ELSE 1 END) ELSE 0 END as PPY_INVOICED_QTY
但代码可读明智,这非常难看,因为我必须对8个不同的列进行操作,性能良好,在16秒内对所有1.4M记录运行。
使用标量UDF会导致性能
Case WHEN ARH.AccountingYear - 2 = @iCurrentYear THEN ARL.ShipQuantity * dbo.fn_GetMultiplier(ARH.InvoiceType) ELSE 0 END as PPY_INVOICED_QTY
差不多花了5分钟。所以不能这样做。
我能想到的其他选择是:
我遗失的任何其他想法,或有关此类事情的最佳做法的建议?我无法更改由第三方应用程序建立的存储数据。
答案 0 :(得分:0)
我决定使用Igor建议的多个视图,实际上使用嵌套版本,即使可读性较低,由于只有1个命名视图而不是2,维护更容易。性能类似于8个不同的case语句,因此整体运行时间不到20秒。
感谢您的见解。