2016-09-22 8 views
1

私はアクセスするのが初めてで、GUIでクエリを取得しました。テーブルのクエリで右テーブルから複数の結果が返される

申し訳ありませんが、すべての顧客が左のテーブルにあり、完了したすべての作業が正しいテーブルにあるように、参加設定があります。

両方のテーブルに顧客の参照番号があるので、私はそれに基づいて参加しました。

お客様は、私たちが作業を実行する前に不平を言うことがありますので、テーブルは左側の結合です。

問題は、顧客が複数の作業項目を持っている可能性があるため、作業項目が複数実行されている場合に、苦情表の各行が複数回返されます。

ジョインにいくつかのロジックを追加する必要があります。そのため、各クレームに対して1つの作業項目しか返されません。複数の作業項目が存在する場合は、問合せで日付のクローゼットを含む作業項目を苦情の日付に戻しますが、その後は決して返さないようにします。

苦情に以前に発生した作業項目がない場合は、依頼が表示されますが、作業項目のデータが必要です。

私は本当にデザイナーのGUIを使用する方法を知っているが、SQLは、現時点では次のようになります。

SELECT DISTINCT [CEAR326 Master Data fo access1].ID, 
    ReportingCategory.ReportingCategory, 
    [CEAR326 Master Data fo access1].Category, 
    [CEAR326 Master Data fo access1].[Sub Category], 
    [CEAR326 Master Data fo access1].[Contact Partner], 
    main_Tbl_ServiceOrder.ServiceProduct, SOType.SOType, 
    Format([Actual Date From],"mmm-yy") AS [Date], 
    [CEAR326 Master Data fo access1].[Actual Date From], 
    main_Tbl_ServiceOrder.BasicStartDate, 
    [CEAR326 Master Data fo access1].Smart_Flag 

    FROM (([CEAR326 Master Data fo access1] 
    LEFT JOIN main_Tbl_ServiceOrder ON [CEAR326 Master Data fo access1].[Contact Partner] = main_Tbl_ServiceOrder.BusinessPartnerNumber) 
    LEFT JOIN ReportingCategory ON [CEAR326 Master Data fo access1].Category = ReportingCategory.Category) LEFT JOIN SOType ON main_Tbl_ServiceOrder.ServiceProduct = SOType.ServiceOrder 

    WHERE (((main_Tbl_ServiceOrder.BasicStartDate)<="actual Date from" Or (main_Tbl_ServiceOrder.BasicStartDate)="0" Or (main_Tbl_ServiceOrder.BasicStartDate) Is Null)) 


    ORDER BY [CEAR326 Master Data fo access1].[Contact Partner], main_Tbl_ServiceOrder.BasicStartDate; 

私が原因行

main_Tbl_ServiceOrder.ServiceProduct, SOType.SOType, 
に必要とされるSELECT DISTINCTが動作していないと信じて

これは、CEAR [Actual Date From]の日付に関連してサービス注文の日付を調べることによって、whereステートメントが入り、関連するサービス注文を選択する場所です。

また、CEARより前に発生した複数のサービスオーダを返す現在のWHERE文に問題があると思います。私はCEAR日付に最も近いものを返すだけです。私が想定し

+0

可能であれば、サンプルデータと予想される結果を使用して、同じ問題を抱えるような単純な例(それぞれ2〜3列の2つのテーブル)を考え出すことができますか? – onedaywhen

+0

WHERE条件が正しく表示されません。 'BasicStartDate'は日付フィールドだと仮定しているので、' 'Actual Date From ''基準は' '(main_Tbl_ServiceOrder.BasicStartDate)<= [CEAR326マスターデータfo access1]。[Actual Date From]'になります。それ以外の場合は、日付を文字列「実際の日付」から比較していますが、これは私には間違っています。あなたはまだ重複しているかもしれませんので、このクエリの結果から 'MAX([BasicStartDate])'を取るためにこの後に積み重ねられたクエリを作成したいと思います。これにより、CEAR日付の後になければ、CEAR日付に最も近いサービス注文のみが残るはずです。 – MoondogsMaDawg

答えて

0

これは、顧客のためのキーとフィールドとしてComplaintIDと

  1. 苦情テーブルを使用し、Complaint_Date
  2. お客様のために、それらのキーやフィールドなどWorkOrderIDとWorkOrder_date

とWorkOrdersテーブル日付ごとに顧客あたり1つの作業オーダーのみです。これが当てはまらない場合は、選択基準の日付フィールドではなく、作業オーダーの自動番号フィールドを使用する必要があります。

これをテーブル名とフィールド名でカスタマイズする必要があります。

SELECT Complaints.ComplaintID, Complaints.Customer, Complaints.Complaint_date, WorkOrders.WorkOrderID, WorkOrders.WorkOrder_date 
FROM Complaints LEFT JOIN WorkOrders ON Complaints.Customer = WorkOrders.Customer 
WHERE (((WorkOrders.WorkOrder_date) Is Null Or (WorkOrders.WorkOrder_date)=(select max(WorkOrder_Date) from WorkOrders T where T.customer=Complaints.customer and T.WorkOrder_date<Complaint_date))); 
関連する問題