2016-06-16 16 views
0

私は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; 
+0

IDフィールドのキーフィールドはありますか?あなたの問題は、クエリの問題よりもテーブルデザイン上の問題のようです。なぜあなたはIDフィールドの代わりにPassengers_nameにリンクしていますか?また、IDはテーブル間で一致しません。つまり、Joen WrightはPASSSENGERSのID = 1、ID = 1、FARE_LEVELの6,7、INCENTIVE_LOGの2,3です。 –

+0

IDフィールドは各テーブルのキーで、自動生成されます行ごとに。テーブルで私はインセンティブと運賃を個人に関連付ける唯一の方法を見ているのはPASSENGER_NAME経由である –

+0

私はそれが本当にここの問題、テーブルデザインの問題だと思う。 IDはおそらく乗客のテーブルではなく、他のテーブルではなくなるはずです。このようにして、キーはテーブル間で一致します。 –

答えて

0

あなたは最初のインセンティブを合計する必要があります。また

SELECT PASSENGERS.PASSENGER_NAME, 
    Count(INCENTIVE_LOG.INCENTIVE) AS CountOfINCENTIVE, 
    Sum(INCENTIVE_LOG.INCENTIVE) AS SumOfINCENTIVE 
FROM (select PASSENGERS.PASSENGER_NAME, 
      Sum(FARE_LEVEL.TICKET_AMT) AS SumOfFARES 
     From PASSENGERS 
      LEFT OUTER JOIN FARE_LEVEL 
       ON PASSENGERS.PASSENGER_NAME = FARE_LEVEL.PASSENGER_NAME 
     Group by PASSENGERS.PASSENGER_NAME 
    ) x 
    INNER JOIN INCENTIVE_LOG 
      ON x.PASSENGER_NAME = INCENTIVE_LOG.PASSENGER_NAME 
GROUP BY PASSENGERS.PASSENGER_NAME; 

、あなたがすることができますが合計されたインセンティブを計算するだけの最初のクエリを作成し、このサマリーでそのクエリを使用してください。

+0

それは意味がありますが、あなたのバージョンのクエリを使用しようとしたときにエラーが発生しました。 "あなたのクエリには集計関数の一部として指定された式" PASSENGER_NAME "が含まれていません –

+0

私はあなたのアドバイスを取って、合算されたインセンティブ(と運賃)を得て、それらを1つに結合して、現在正しい結果を返しています;私はメインの投稿にこのクエリを含めました –

+0

サブクエリーバージョンでグループを見逃しました。 ! – Matt

関連する問題