2016-09-22 2 views
1

Ich bin neu zu zugreifen und habe eine Abfrage in der GUI zusammen gefügt.Join Tabelle Abfrage gibt mehrere Ergebnisse aus der rechten Tabelle

Ich habe eine Join eingerichtet, so dass alle Kunden, die sich beschwert haben, in der linken Tabelle sind und alle Arbeit abgeschlossen ist in der richtigen Tabelle.

Beide Tabelle haben die Referenznummer des Kunden, so dass ich basierend darauf beigetreten bin.

Kunden können sich beschweren, bevor wir irgendwelche Arbeiten ausgeführt haben, so dass die Tabelle eine linke Verknüpfung ist.

Das Problem, das ich habe, ist ein Kunde hatte möglicherweise mehrere Arbeitselemente, so wenn ich den Join erstellen jede Zeile in der Reklamationstabelle wird mehrmals zurückgegeben, wenn sie mehr als auf Arbeitselement ausgeführt haben.

Ich muss den Joins Logik hinzufügen, so dass es nur ein einziges Arbeitselement für jede Beschwerde zurückbringt. Wenn mehrere Arbeitselemente vorhanden sind, möchten Sie, dass die Abfrage das Arbeitselement mit den Datumsbereichen an das Datum der Reklamation zurückgibt, aber nie danach.

Wenn die Reklamation keine Arbeitselemente hat, die vor ihr auftreten, möchte ich immer noch die Reklamation anzeigen, aber mit Daten vom Arbeitselement.

Ich weiß nur, wirklich, wie die Designer-GUI zu bedienen, aber die SQL wie folgt aussieht im Moment:

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; 

glaube ich, die select distinct nicht als durch die Leitung erforderlichen Arbeits

main_Tbl_ServiceOrder.ServiceProduct, SOType.SOType, 

Hier möchte ich meine where-Anweisung eingeben und den entsprechenden Serviceauftrag auswählen, indem ich das Datum des Serviceauftrags in Bezug auf das Datum des CEAR [Tatsächliches Datum von] ansehe.

Ich denke auch, es würde ein Problem mit der aktuellen WHERE-Anweisung geben, die mehrere Serviceaufträge zurückgibt, wenn sie vor dem CEAR auftreten. Ich möchte nur diejenige zurückgeben, die dem CEAR-Datum am nächsten ist.

+0

Gibt es eine Chance, dass Sie ein einfacheres Beispiel (sagen wir zwei Tabellen mit nur ein paar Spalten) vorfinden, das das gleiche Problem aufweist, vorzugsweise mit Beispieldaten und erwarteten Ergebnissen? – onedaywhen

+0

Ihre 'WHERE'-Bedingung sieht nicht richtig aus. Ich nehme an, 'BasicStartDate' ist ein Datumsfeld, daher müssen Sie das' 'Actual Date From''-Kriterium sein (main_Tbl_ServiceOrder.BasicStartDate) <= [CEAR326 Stammdaten für Zugriff1]. [Aktuelles Datum von]'. Ansonsten vergleichen Sie die Daten mit der Textzeichenfolge "Aktuelles Datum von", was für mich inkorrekt aussieht.Sie können jedoch immer noch Duplikate haben, also würde ich danach eine gestapelte Abfrage erstellen, um 'MAX ([BasicStartDate])' von den Ergebnissen dieser Abfrage zu nehmen. Das sollte nur die Service-Bestellung verlassen, die dem CEAR-Datum am nächsten ist, ohne nach dem CEAR-Datum zu sein. – MoondogsMaDawg

Antwort

0

Dies verwendet

  1. Tabelle Beschwerden mit ComplaintID als Schlüssel und Felder für Kunden und Complaint_Date
  2. Arbeitsaufträgen Tabelle mit WorkOrderID wie sie Schlüssel und Felder für Kunden und WorkOrder_date

ich dort angenommen ist nur ein Arbeitsauftrag pro Kunde pro Datum. Wenn dies nicht zutrifft, müssen Sie möglicherweise anstelle des Datumsfelds in den Selektionskriterien ein Feld mit automatischer Nummer für die WorkOrders verwenden

Sie sollten dies mit Ihren Tabellennamen und Feldnamen anpassen können.

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))); 
Verwandte Themen