帐户(表格)
+----+----------+----------+-------+
| id | account# | supplier | RepID |
+----+----------+----------+-------+
| 1 | 123xyz | Boston | 2 |
| 2 | 245xyz | Chicago | 2 |
| 3 | 425xyz | Chicago | 3 |
+----+----------+----------+-------+
PayOut(表格)
+----+----------+----------+-------------+--------+
| 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列)加入。这会产生一个问题,即它可能会产生多对多的关系。但是如果它们处于活动状态我们会过滤我们的记录,并且在创建支出时我们会在支付表上使用第二个过滤器。付款是按月创建的。我认为这有两个问题
这是查询。它使用group by删除重复项。我希望有一个优先考虑的预先查询,并考虑到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 EXIST来改进它,使其更快并消除重复的问题吗?
请注意,此查询用于获取代表的付款。因此,每个记录都有repid字段,它被分配给它。理想情况下,我想使用Select WHERE Exist查询。
答案 0 :(得分:0)
很难准确理解你想要什么,因为在一个地方你说'你想要'重复,但是你说你正在使用group by删除重复项。所以第一个想法是“为什么不只是摆脱这个群体?”。但是我必须相信你已经足够聪明,可以自己想到这一点,所以我认为它必须在那里存在。
我认为,如果您可以发布实际查询,这里有人可以很轻松地帮助您,但是既然您说不能,我会尝试给您一些方向来解决问题......
不要尝试在一个语句中执行所有操作,而是使用临时表或视图将其拆分。你可能更容易想到如何摆脱你不想要的副本,并保留你先做的那些并将它们放到一个临时表中,然后将这些表连接在一起并使用它。