私はAccessで乗客情報を持つ複数のテーブルを照会しています。私はこの問題を引き起こしていると思っているものにこれを掘り下げることができましたが、それを修正する方法がわかりません。私はそれらを結合するために、このクエリを使用しています 重複した行を返す複数の結合を持つMS Accessクエリ
ID | PASSENGER_NAME | INCENTIVE_AMT
-------------------------------------
1 | Adam Yang | $1000.00
2 | Cheryl Brown | $1000.00
3 | John Wright | $1000.00
4 | John Wright | $1000.00
5 | John Wright | $1000.00
INCENTIVE_LOG
PASSENGERS
ID | PASSENGER_NAME | COST_CENTER
-------------------------------------
1 | John Wright | 31231
2 | Cheryl Brown | 54555
3 | Adam Yang | 65655
FARE_LEVEL
ID | TICKET_NUMBER | PASSENGER_NAME | TICKET_AMT | IS_REFUND
---------------------------------------------------------------
1 | 14325435 | John Wright | $632.64 | 0
2 | 46746745 | Adam Yang | $797.32 | 0
3 | 45354434 | Cheryl Brown | $2331.00 | 0
4 | 67876456 | Cheryl Brown | $990.11 | 0
5 | 34654546 | Adam Yang | $552.71 | 0
6 | 14325435 | John Wright | -$632.64 | 1
7 | 87989879 | John Wright | $123.11 | 0
8 | 99124324 | Adam Yang | $1114.42 | 0
9 | 77231235 | Adam Yang | $6232.32 | 0
:
は基本的に3つのテーブルがあります
SELECT
PASSENGERS.PASSENGER_NAME,
Sum(FARE_LEVEL.TICKET_AMT) AS SumOfFARES,
Count(INCENTIVE_LOG.INCENTIVE) AS CountOfINCENTIVE,
Sum(INCENTIVE_LOG.INCENTIVE) AS SumOfINCENTIVE
FROM (PASSENGERS LEFT OUTER JOIN FARE_LEVEL ON PASSENGERS.PASSENGER_NAME = FARE_LEVEL.PASSENGER_NAME)
INNER JOIN INCENTIVE_LOG ON PASSENGERS.PASSENGER_NAME = INCENTIVE_LOG.PASSENGER_NAME
GROUP BY PASSENGERS.PASSENGER_NAME;
私が探しています結果はPASSENGERテーブル内の各乗客のためのすべての運賃の合計だけでなく、PASSENGERテーブルに各乗客のために撮影したすべてのインセンティブの合計です。だから "John Wright"のために私は見たいと思っています
PASSENGER_NAME | SumOfFares | CountOfIncentive | SumOfIncentive
---------------------------------------------------------------
John Wright | $123.11 | 3 | $3000.00
代わりに私は二重に見える結果を得ています。 GROUP BYを
に変更すると、GROUP BY PASSENGERS.PASSENGER_NAME, INCENTIVE_LOG.ID, FARE_LEVEL.ID;
エラーが合計されている重複した行がすべて表示されます。旅客に対応するFARE_LEVEL行とINCENTIVE行の組み合わせごとに行を作成するように見えるので、誰かが7つの運賃と3つのインセンティブを持っていれば21行が作成されます。
私の結論に問題があることはかなり確信していますが、修正方法がわかりません。
EDIT: は、私は、元のクエリ内の2つのサブクエリを作成することによって、問題を解決することができた
SELECT
PASSENGERS.PASSENGER_NAME,
Sum(Query4.SumOfTICKET_AMT) AS SumOfFARES,
Sum(Query2.SumOfINCENTIVE) AS Incentive
FROM (PASSENGERS
LEFT OUTER JOIN (
SELECT PASSENGERS.PASSENGER_NAME, Sum(FARE_LEVEL.TICKET_AMT) AS SumOfTICKET_AMT
FROM PASSENGERS LEFT OUTER JOIN FARE_LEVEL ON PASSENGERS.PASSENGER_NAME = FARE_LEVEL.PASSENGER_NAME
GROUP BY PASSENGERS.PASSENGER_NAME
) AS Query4
ON PASSENGERS.PASSENGER_NAME = Query4.PASSENGER_NAME)
INNER JOIN (
SELECT PASSENGERS.PASSENGER_NAME, Sum(INCENTIVE_LOG.INCENTIVE) AS SumOfINCENTIVE
FROM PASSENGERS LEFT OUTER JOIN INCENTIVE_LOG ON PASSENGERS.PASSENGER_NAME = INCENTIVE_LOG.PASSENGER_NAME
GROUP BY PASSENGERS.PASSENGER_NAME
) AS Query2
ON PASSENGERS.PASSENGER_NAME = Query2.PASSENGER_NAME
GROUP BY PASSENGERS.PASSENGER_NAME;
IDフィールドのキーフィールドはありますか?あなたの問題は、クエリの問題よりもテーブルデザイン上の問題のようです。なぜあなたはIDフィールドの代わりにPassengers_nameにリンクしていますか?また、IDはテーブル間で一致しません。つまり、Joen WrightはPASSSENGERSのID = 1、ID = 1、FARE_LEVELの6,7、INCENTIVE_LOGの2,3です。 –
IDフィールドは各テーブルのキーで、自動生成されます行ごとに。テーブルで私はインセンティブと運賃を個人に関連付ける唯一の方法を見ているのはPASSENGER_NAME経由である –
私はそれが本当にここの問題、テーブルデザインの問題だと思う。 IDはおそらく乗客のテーブルではなく、他のテーブルではなくなるはずです。このようにして、キーはテーブル間で一致します。 –