2016-04-19 23 views
1

投稿を介して行ってきましたが、まだ私は同じことをすることができません。誰かが私を共有してくださいいくつかのアイデアを持ってください。どのように私は内部結合のSQLを使用して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] 

私はヌルレコードを削除する必要がP/oを下に取得しています:以下 enter image description here

は、スクリーンショットであると私はノー強調表示行の要求に基づいて重複を削除する必要があります

+3

のようなもの。要求番号は同じですが他の情報は異なります – bmsqldev

+0

あなたはあなたの全要件を質問に追加する必要があります。 – user1666620

+1

これをお読みください? http://stackoverflow.com/help/mcve問題を特定し、* minimal *の例を見つけるためにあなた自身でいくつかの作業を行うことで、あなた自身で解決するかもしれません。あなたがしなくても、あなたはもっときれいな質問をし、ここからより良い答えを得るでしょう。 – MatBailie

答えて

0

これで、SQLはデータの重複行を削除して削除するよう指示しています。ただし、IDに基づいてのみ重複が返されます。

これはあなたのデータで動作するかどうかをチェックする必要がありますが、外側の選択ではID以外のすべてを集約に変更することができます。他のすべての列でMAXを実行し、次にIDフィールドでGROUP BYを実行すると、IDごとに1行、残りの列から最大値が得られます。提供されたデータでは、これはあなたの後ろのものを与えるだろうが、コードを実際にライブする前に正しい結果が得られているかどうかを完全なデータセットで確認してください。

0

Travel_RequestIdだけあなたが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

を使用することができます記録しなければならない場合、私はあなたがPartition Byrow_number()

例の助けを借りてそれを行うことができると思います。

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

参照Group by vs partition by

編集

クエリでこれらの行が重複していなかった

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

たとえば、以下のようなrow_number()を使用すると、rownumberが定義されていないというエラーが返されます。例:rownum、列、列の内部結合条件およびrownum = 1としてSELECT row_number()を超える(TRD.DepartureDateによるTR.RequestNO順のパーティション) – chandan

関連する問題