2016-04-19 4 views
1

ging durch die Post ist hier, aber immer noch nicht in der Lage, das gleiche zu tun. bitte irgendjemand eine Idee haben, teilen Sie mich bitte.Wie eliminiere ich Duplikate Datensätze in Sql mit inneren join sql

SELECT DISTINCT 
    TR.Id as Travel_RequestId, 
    TREP.FirstName+' '+TREP.LastName as [Traveler Name], 
    TR.EmployeeNo, 
    TR.RequestNO, 
    TravelType=(case TR.IsOneWay 
    when '1' THEN 'OW' 
    ELSE 'RT' 
    END), 
    TRPD.SWONCode, 
    cast(TRD.GESSReceivedDate as date) as GESSReceivedDate, 
    TRD.Deal, 
    TRD.AirLineCode, 
    cast(TRD.DepartureDate as date) as Departure_Date, 
    cast(TRD.TentativeReturnDate as date) as Tentative_Return_Date, 
    cast(TRTD.IssuanceDate as Date) as Tcket_IssuanceDate, 
    TRTD.DeskName, 
    (select Description from AirlineName where Code=TRD.AirlineNameCode) as Airline, 
    (select Description from Currency where Code=TRID.CurrencyTypeCode) as CurrencyType, 
    case when (isnumeric(TRTD.BaseFare) & isnumeric(TRTD.ServiceFee)) =1 then 
    (convert(float, TRTD.BaseFare)+convert(float, TRTD.ServiceFee)) 
    else 
    null 
    end as TicketAmount, 
    TRTD.Number As [Ticket Number], 
    TRTD.AgentName, 
    cast(TRID.IssueDate as date) As InvoiceDate, 
    cast(TRID.CreditNoteDate as date) as CreditNoteDate, 
    TRID.CreditNoteNumber, 
    TRID.CreditNoteAmount, 
    TRID.AmountPayable, 
    TRTD.TotalFare, 
    TRTD.DeskName, 
    TRID.InvoiceAmount, 
    TRID.InvoiceNumber, 
    TRID.CurrencyTypeCode, 
    TRID.AdcolAmount, 
    TRID.ChqNo, 
    TM.Description as Travel_Mode, 

    TRID.Statement, 

    TRD.Sector As Itineary, 
    TRD.ServiceClass As ClassOfTravel 

    from TravelRequest TR LEFT JOIN(SELECT mt.*  
    FROM TravelRequestDetails mt INNER JOIN 
(
    SELECT travelrequestId, MIN(DepartureDate) DepartureDate 
    FROM TravelRequestDetails 
    GROUP BY travelrequestId 
) t ON mt.travelrequestId = t.travelrequestId AND mt.DepartureDate = t.DepartureDate)TRD ON TRD.TravelRequestId =TR.Id 

    left join TravelRequestEmployeeProfile TREP 
    on TREP.TravelRequestId=TRD.TravelRequestId 
    left join TravelRequestProjectDetails TRPD 
    on TRPD.TravelRequestId=TRD.TravelRequestId 
    left join TravelMode TM 
    on TM.Code=TRPD.TravelModeCode 
    left join TravelRequestTicketDetails TRTD 
    on TRTD.TravelRequestId=TRD.TravelRequestId 
    left join TravelRequestInvoiceDetails TRID 
    on TRID.TravelRequestId=TRD.TravelRequestId 
    where TR.Status='CL' and TR.RequestType='BT' 
    and TR.UpdatedOn Between DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()-1), 0) + '18:01' 
      AND DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0) + '18:00' order by [Traveler Name] 

Ich erhalte die unten o/p, wo ich die Null-Datensätze entfernen müssen: enter image description here

Unten ist der Screenshot und ich brauche die Vervielfältigung auf Anfrage nicht in markierte Zeile basierend entfernen

+3

diese Zeilen nicht dupliziert wurden. Anfrage Nein ist gleich, aber andere Informationen sind anders – bmsqldev

+0

Sie müssen Ihre vollständigen Anforderungen zur Frage hinzufügen, und vielleicht die Strukturen der Tabellen, denen Sie beitreten. – user1666620

+1

Bitte lesen Sie das? http://stackoverflow.com/help/mcve Wenn Sie selbst daran arbeiten, das Problem zu isolieren und ein * minimales * Beispiel zu finden, können Sie es selbst lösen und feststellen, dass Sie dabei selbst lernen. Selbst wenn Sie das nicht tun, werden Sie eine viel sauberere Frage haben und bessere Antworten von hier bekommen. – MatBailie

Antwort

0

Ok, SQL macht also das, was Sie sagen, und doppelte Datenzeilen entfernen. Was Sie jedoch tun möchten, ist die Rückgabe von Duplikaten nur basierend auf der ID.

Sie müssen überprüfen, ob dies mit Ihren Daten funktioniert, aber in Ihrer äußeren Auswahl könnten Sie alles, was keine ID ist, in ein Aggregat ändern. Wenn Sie einen MAX für alle anderen Spalten und dann GROUP BY für das ID-Feld ausführen, erhalten Sie für jede ID eine Zeile und für die verbleibenden Spalten den höchsten Wert. In den gelieferten Daten erhalten Sie das, wonach Sie suchen, aber bitte überprüfen Sie mit Ihrem vollständigen Datensatz, ob dies die richtigen Ergebnisse liefert, bevor Sie den Code live übertragen.

0

Wenn jeder Travel_RequestId sollte nur haben aufzeichnen Sie group by

with cte as 
(SELECT DISTINCT 
    TR.Id as Travel_RequestId, 
    TREP.FirstName+' '+TREP.LastName as [Traveler Name], 
    TR.EmployeeNo, 
    TR.RequestNO, 
    TravelType=(case TR.IsOneWay 
    when '1' THEN 'OW' 
    ELSE 'RT' 
    END), 
    TRPD.SWONCode, 
    cast(TRD.GESSReceivedDate as date) as GESSReceivedDate, 
    TRD.Deal, 
    TRD.AirLineCode, 
    cast(TRD.DepartureDate as date) as Departure_Date, 
    cast(TRD.TentativeReturnDate as date) as Tentative_Return_Date, 
    cast(TRTD.IssuanceDate as Date) as Tcket_IssuanceDate, 
    TRTD.DeskName, 
    (select Description from AirlineName where Code=TRD.AirlineNameCode) as Airline, 
    (select Description from Currency where Code=TRID.CurrencyTypeCode) as CurrencyType, 
    case when (isnumeric(TRTD.BaseFare) & isnumeric(TRTD.ServiceFee)) =1 then 
    (convert(float, TRTD.BaseFare)+convert(float, TRTD.ServiceFee)) 
    else 
    null 
    end as TicketAmount, 
    TRTD.Number As [Ticket Number], 
    TRTD.AgentName, 
    cast(TRID.IssueDate as date) As InvoiceDate, 
    cast(TRID.CreditNoteDate as date) as CreditNoteDate, 
    TRID.CreditNoteNumber, 
    TRID.CreditNoteAmount, 
    TRID.AmountPayable, 
    TRTD.TotalFare, 
    TRTD.DeskName, 
    TRID.InvoiceAmount, 
    TRID.InvoiceNumber, 
    TRID.CurrencyTypeCode, 
    TRID.AdcolAmount, 
    TRID.ChqNo, 
    TM.Description as Travel_Mode, 

    TRID.Statement, 

    TRD.Sector As Itineary, 
    TRD.ServiceClass As ClassOfTravel 

    from TravelRequest TR LEFT JOIN(SELECT mt.*  
    FROM TravelRequestDetails mt INNER JOIN 
(
    SELECT travelrequestId, MIN(DepartureDate) DepartureDate 
    FROM TravelRequestDetails 
    GROUP BY travelrequestId 
) t ON mt.travelrequestId = t.travelrequestId AND mt.DepartureDate = t.DepartureDate)TRD ON TRD.TravelRequestId =TR.Id 

    left join TravelRequestEmployeeProfile TREP 
    on TREP.TravelRequestId=TRD.TravelRequestId 
    left join TravelRequestProjectDetails TRPD 
    on TRPD.TravelRequestId=TRD.TravelRequestId 
    left join TravelMode TM 
    on TM.Code=TRPD.TravelModeCode 
    left join TravelRequestTicketDetails TRTD 
    on TRTD.TravelRequestId=TRD.TravelRequestId 
    left join TravelRequestInvoiceDetails TRID 
    on TRID.TravelRequestId=TRD.TravelRequestId 
    where TR.Status='CL' and TR.RequestType='BT' 
    and TR.UpdatedOn Between DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()-1), 0) + '18:01' 
      AND DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0) + '18:00' 
) 

select Travel_RequestId, max ([Traveler Name]) as [Traveler Name], max (EmployeeNo) as EmployeeNo, max (RequestNO) as RequestNO, 
max (TravelType) as TravelType, max(SWONCode) as SWONCode /* and other columns */ 
from cte 
0

Ich denke, können Sie es mit Hilfe von Partition By tun können, und row_number()

Beispiel:

select row_number() over (partition by customerId order by orderId) as rowNum, customerId,Name,number over (partition by customerId order by orderId) from Orders where rowNum=1

Ref Group by vs partition by .

Edited

In Ihrer Anfrage so etwas wie

select ROW_NUMBER() over (partition by TR.RequestNOorder by TRD.DepartureDate) as rowNum, TR.RequestNOorder,min(TR.DepartureDate) over (partition by TR.RequestNOorder) as DepartureDate from TravelRequestDetails where rowNum=1

+0

zum Beispiel, wenn ich row_number() wie unten verwenden gibt es einen Fehler, der sagt, dass rownumber nicht definiert ist. ex: SELECT row_number() über (Partition by TR.RequestNO Auftrag von TRD.DepartureDate) als rownum, columns, columns innere Join-Bedingungen und rownum = 1 – chandan