SQL发票查询性能将Credits转换为负数

时间:2016-04-14 17:25:51

标签: sql-server

我有第三方数据库,其中包含我需要报告的发票数据。无论“发票”是贷项凭证还是实际发票,数量和金额字段都存储为正数。有一个字符字段包含类型“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分钟。所以不能这样做。

我能想到的其他选择是:

  1. 多级视图,使用新视图添加乘数列,然后从中进行SELECT并使用新列进行乘法
  2. 构建一个包含2列和2条记录的表,R,-1和I,1,并根据InvoiceType加入它,但这似乎过多了。
  3. 我遗失的任何其他想法,或有关此类事情的最佳做法的建议?我无法更改由第三方应用程序建立的存储数据。

1 个答案:

答案 0 :(得分:0)

我决定使用Igor建议的多个视图,实际上使用嵌套版本,即使可读性较低,由于只有1个命名视图而不是2,维护更容易。性能类似于8个不同的case语句,因此整体运行时间不到20秒。

感谢您的见解。