帐户(表格)
+----+----------+----------+-------+
| id | account# | supplier | RepID |
+----+----------+----------+-------+
| 1 | 123xyz | Boston | 2 |
| 2 | 245xyz | Chicago | 2 |
| 3 | 425xyz | Chicago | 3 |
+----+----------+----------+-------+
支付(表格)
+----+----------+----------+-------------+--------+
| id | account# | supplier | datecreated | Amount |
+----+----------+----------+-------------+--------+
| 5 | 245xyz | Chicago | 01-15-2009 | 25 |
| 6 | 123xyz | Boston | 10-15-2011 | 50 |
| 7 | 123xyz | Boston | 10-15-2011 | -50 |
| 8 | 123xyz | Boston | 10-15-2011 | 50 |
| 9 | 425xyz | Chicago | 10-15-2011 | 100 |
+----+----------+----------+-------------+--------+
我有账户表和支付表。支付表来自国外,因此我们无法控制它。这给我们留下了一个问题,我们无法根据记录 ID 字段连接两个表,这是我们无法解决的一个问题。因此,我们根据 Account#、SupplierID(第 2 列和第 3 列)加入。这会产生一个问题,它会创建(可能)多对多关系。但是我们过滤我们的记录,如果它们是活动的,我们在创建支付时在支付表上使用第二个过滤器。付款是按月创建的。在我看来有两个问题
- 查询需要相当长的时间才能完成(可能效率低下)
- 删除了某些不应删除的重复项。示例是支出表中的记录 6 和 8。这里发生的事情是,我们有一个客户,然后客户取消了,然后他又让他回来了。在这种情况下 +50、-50 和 +50。同样,所有值都是有效的,并且必须在报告中显示以供审计。目前只显示一个+50,另一个丢失。报告中偶尔会出现一些其他问题。
这是查询。它使用分组依据来删除重复项。我想要一个预先查询,它的表现优于并且确实考虑到只要它们出现在报告的月份中,PayOut 表中的任何记录都不会重复。
这是我们当前的查询
/* Supplied to Store Procedure */
-----------------------------------
@RepID // the person for whome payout is calculated
@Month // of payment date
@year // year of payment date
-----------------------------------
select distinct
A.col1,
A.col2,
...
A.col10,
B.col2,
B.Col2,
B.Amount /* this is the important column, portion of which goes to Rep */
from records A
JOIN payout B
on A.Supplier = B.Supplier AND A.Account# = B.Account#
where datepart(mm, B.datecreated) = @Month /* parameter to stored procedure */
and datepart(yyyy, B.datecreated) = @Year
and A.[rep ID] = @RepID /* parameter to SP */
group by
col1,col2,col3,....col10
order by customerName
这个查询是最优的吗?我可以使用 CROSS APPLY 或 WHERE EXISTs 改进它,使其更快并消除重复问题吗?
请注意,此查询用于获取代表的付款。因此,每条记录都有 repid 字段分配给谁。理想情况下,我想使用 Select WHERE Exist 查询。