2010-12-17 4 views
1

내 SQL 쿼리가 여러 테이블에 조인되므로 여러 결과가 표시됩니다. SELECT DISTINCT에 대해 알고 있지만 필드 ('Account.Name') 중 하나가 다른 경우가 있으므로이 레코드를 새 행으로 처리합니다. 어떤 아이디어? 여기 내 SQL은 다음과 같습니다.SQL 도움말 - 조인에서 중복 반환

SELECT DISTINCT 
         d.ID, ISNULL(d.OnHold, 0) AS 'OnHold', d.OnHoldReason AS 'On Hold Reason', d.LegacyID AS 'Consignment#', d.IntConNo AS 'Consignment Ref', 
         CASE WHEN JobType = 'O' THEN 'Outward' ELSE 'Collection' END AS 'Job Type', d.TripDate AS 'Delivery Date', d.DeliveryTown AS 'Delivery Town', 
         d.DeliveryPostcode AS 'Delivery Postcode', d.VehicleReg AS 'Vehicle Reg', d.RequiredCollectionDate AS 'Req. Collection Date', 
         d.VehicleReg AS 'Vehicle Registration', CASE WHEN d .DeliveryStatus = 2 THEN 'OK' END AS 'Delivery Status', d.ItemsignedBy AS 'POD Signed By', 
         d.BaseRate AS 'Base Rate', d.FuelSurcharge AS 'Fuel Surcharge', d.AdditionalCharges AS 'Additional Charges', 
         d.BaseRate + d.FuelSurcharge + d.AdditionalCharges AS 'Value', CASE WHEN InvoiceNumber IS NULL THEN CONVERT(bit, 0) ELSE CONVERT(bit, 1) 
         END AS Tagged, CASE WHEN di.Total = di.Delivered THEN 'Recieved' ELSE 'Not Recieved' END AS 'Items', Account.Name 
FROM   Deliveries AS d LEFT OUTER JOIN 
          (SELECT  Consignment, COUNT(*) AS Total, COUNT(CASE WHEN Status = 2 THEN 1 END) AS Delivered 
          FROM   Items 
          GROUP BY Consignment) AS di ON d.ID = di.Consignment INNER JOIN 
         Account ON d.Customer = Account.InvoiceAccount 
WHERE  (d.InvoiceNumber IS NULL) AND (d.TripDate > 29/11/2010) 
ORDER BY 'Consignment#' 
+2

Account.Name이 다른 경우 새 레코드입니다. . 나는 당신이 뭘 하려는지 명확하지 않다. Account.Name의 모든 항목을보고 싶지 않으면 반환하거나 하위 선택 또는 sproc을 사용하여 모든 Account.Name 인스턴스와 함께 (즉 연결된) 집계 필드를 생성하지 마십시오. – Lazarus

답변

1

가장 쉬운 해결책은 DISTINCT를 GROUP BY로 바꾸는 것입니다. dowside는 하나의 accountname 만 반환됩니다.

다른 솔루션

  • SELECT d.ID 
         , ISNULL(d.OnHold, 0) AS 'OnHold' 
         , d.OnHoldReason AS 'On Hold Reason' 
         , d.LegacyID AS 'Consignment#' 
         , d.IntConNo AS 'Consignment Ref' 
         , CASE WHEN JobType = 'O' THEN 'Outward' ELSE 'Collection' END AS 'Job Type' 
         , d.TripDate AS 'Delivery Date' 
         , d.DeliveryTown AS 'Delivery Town' 
         , d.DeliveryPostcode AS 'Delivery Postcode' 
         , d.VehicleReg AS 'Vehicle Reg' 
         , d.RequiredCollectionDate AS 'Req. Collection Date' 
         , d.VehicleReg AS 'Vehicle Registration' 
         , CASE WHEN d .DeliveryStatus = 2 THEN 'OK' END AS 'Delivery Status', d.ItemsignedBy AS 'POD Signed By' 
         , d.BaseRate AS 'Base Rate' 
         , d.FuelSurcharge AS 'Fuel Surcharge' 
         , d.AdditionalCharges AS 'Additional Charges' 
         , d.BaseRate + d.FuelSurcharge + d.AdditionalCharges AS 'Value' 
         , CASE WHEN InvoiceNumber IS NULL THEN CONVERT(bit, 0) ELSE CONVERT(bit, 1) END AS Tagged 
         , CASE WHEN di.Total = di.Delivered THEN 'Recieved' ELSE 'Not Recieved' END AS 'Items' 
         , MIN(Account.Name) 
    FROM Deliveries AS d 
         LEFT OUTER JOIN (
          SELECT Consignment 
            , COUNT(*) AS Total 
            , COUNT(CASE WHEN Status = 2 THEN 1 END) AS Delivered 
          FROM Items 
          GROUP BY 
            Consignment 
         ) AS di ON d.ID = di.Consignment 
         INNER JOIN Account ON d.Customer = Account.InvoiceAccount 
    WHERE (d.InvoiceNumber IS NULL) 
         AND (d.TripDate > 29/11/2010) 
    GROUP BY 
         d.ID 
         , ISNULL(d.OnHold, 0) 
         , d.OnHoldReason 
         , d.LegacyID 
         , d.IntConNo 
         , CASE WHEN JobType = 'O' THEN 'Outward' ELSE 'Collection' END 
         , d.TripDate 
         , d.DeliveryTown 
         , d.DeliveryPostcode 
         , d.VehicleReg 
         , d.RequiredCollectionDate 
         , d.VehicleReg 
         , CASE WHEN d .DeliveryStatus = 2 THEN 'OK' END AS 'Delivery Status', d.ItemsignedBy 
         , d.BaseRate 
         , d.FuelSurcharge 
         , d.AdditionalCharges 
         , d.BaseRate + d.FuelSurcharge + d.AdditionalCharges 
         , CASE WHEN InvoiceNumber IS NULL THEN CONVERT(bit, 0) ELSE CONVERT(bit, 1) END 
         , CASE WHEN di.Total = di.Delivered THEN 'Recieved' ELSE 'Not Recieved' END 
    ORDER BY 
         'Consignment#' 
    
    에 의해 그룹을 사용하여 하나의 이름 만

에게 반환하는 하위 선택을 사용하는 연결된 계정 이름을 반환하는 함수를 만들 수

+0

고마워 친구, 내가 하위 선택 경로를 내려갈 것 같아. – Chris