アカウント (表)
+----+----------+----------+-------+
| 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 フィールドに基づいて 2 つのテーブルを結合できないという問題が残ります。これは、解決できない問題の 1 つです。したがって、Account#、SupplierID (2 列目と 3 列目) に基づいて結合します。これにより、(おそらく)多対多の関係が作成されるという問題が発生します。ただし、レコードがアクティブである場合はレコードをフィルター処理し、支払いが作成されたときに支払いテーブルで 2 番目のフィルターを使用します。支払いは毎月作成されます。私の見解では、これには2つの問題があります
- クエリが完了するまでにかなりの時間がかかります (非効率的である可能性があります)
- 削除されるべきではない特定の重複が削除されます。例は、配当表のレコード 6 と 8 です。ここで起こったことは、顧客を獲得した後、顧客がキャンセルした後、彼が戻ってきたということです。この場合、+50、-50、+50 です。ここでも、すべての値が有効であり、監査目的でレポートに表示する必要があります。現在、+50 は 1 つだけ表示されており、もう 1 つは失われています。たまに来るレポートには他にもいくつかの問題があります。
これがクエリです。groups 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 クエリを使用したいと思います。