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 フィールドに基づいて 2 つのテーブルを結合できないという問題が残ります。これは、解決できない問題の 1 つです。したがって、Account#、SupplierID (2 列目と 3 列目) に基づいて結合します。これにより、(おそらく)多対多の関係が作成されるという問題が発生します。ただし、レコードがアクティブである場合はレコードをフィルター処理し、支払いが作成されたときに支払いテーブルで 2 番目のフィルターを使用します。支払いは毎月作成されます。私の見解では、これには2つの問題があります

  1. クエリが完了するまでにかなりの時間がかかります (非効率的である可能性があります)
  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 クエリを使用したいと思います。

4

1 に答える 1

0

ある場所で重複を「欲しい」と言っているのに、グループを使用して重複を削除していると言うため、何が必要かを正確に理解することは困難です。したがって、最初に考えるのは、「group by を削除してみませんか?」ということです。しかし、私はあなたが自分でそれを考えたほど賢いと信じなければなりません.

実際のクエリを投稿できれば、ここの誰かがあなたをかなり簡単に助けることができると思いますが、あなたができないと言うので、問題を解決するための方向性を教えようとします...

1 つのステートメントですべてを実行しようとする代わりに、一時テーブルまたはビューを使用して分割します。不要な重複を取り除き、最初に重複したものを保持して一時テーブルに入れ、テーブルを結合してそれを処理する方法を考える方が簡単かもしれません.

于 2011-11-15T23:21:42.227 に答える