0

帐户(表格)

+----+----------+----------+-------+
| 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 列)加入。这会产生一个问题,它会创建(可能)多对多关系。但是我们过滤我们的记录,如果它们是活动的,我们在创建支付时在支付表上使用第二个过滤器。付款是按月创建的。在我看来有两个问题

  1. 查询需要相当长的时间才能完成(可能效率低下)
  2. 删除了某些不应删除的重复项。示例是支出表中的记录 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 查询。

4

1 回答 1

0

很难准确理解您想要什么,因为在一个地方您说您“想要”重复项,但随后您说您正在使用 group by 删除重复项。所以第一个想法是“为什么不直接摆脱 group by?”。但我必须相信你足够聪明,自己也想到了这一点,所以我认为它的存在是有原因的。

如果您可以发布实际查询,我认为这里的某人可以很容易地为您提供帮助,但是既然您说不能,我将尝试为您提供一些解决问题的方向...

不要试图在一个语句中完成所有事情,而是使用临时表或视图来拆分它。您可能更容易考虑如何摆脱您不想要的重复项并保留您首先要做的那些并将它们放入临时表中,然后将这些表连接在一起并使用它。

于 2011-11-15T23:21:42.227 回答