customers 테이블에는 2016 년에 1500 개의 주문이있는 총 1000 명의 고객이 있습니다.하지만 FY에 총 주문 수를 가진 모든 고객을 표시하려고합니다 고객이 그 회계 연도에 주문했는지 여부. 그러나 SQL Server 2012의 다음 쿼리는 1490 만 표시됩니다.이 LEFT OUTER JOIN이 왼쪽의 모든 기본 키를 포함하지 않는 이유
여기에 누락 된 부분은 무엇입니까?
SELECT c.CustomerID, count(*) AS TotalOrders
FROM Customers c
LEFT JOIN Orders o ON c.CustomerID = o.CustomerID
WHERE o.FiscalYear = '2016'
GROUP BY c.CustomerID
UPDATE :
이다음 쿼리는 하나 개 더 레코드 (1491)를 반환은 - 아직 9 개 이상의 레코드가 없습니다.
SELECT c.CustomerID, count(*) AS TotalOrders
FROM Customers c
LEFT JOIN Orders o ON c.CustomerID = o.CustomerID
AND o.FiscalYear = '2016'
GROUP BY c.CustomerID
조인 후에 where 절이 적용됩니다. 따라서 조인은 주.없이 고객에 대한 널 값을 리턴합니다. 하지만 그 고객은 아무런 명령도 내리지 않고 있습니다. 회계 년도는 2016 년과 같지 않아서 레코드가 제외됩니다. 외부 조인과 관련된 제한 조건을 조인 기준으로 이동하여 조인과 함께 제한이 적용되도록 수정합니다. – xQbert
총 레코드 수는 1000 (고객)이어야합니다. 합계의 수는 1500이어야합니다. 합계가 1500 미만인 유일한 차이는 고객 및 고아 주문을 삭제 한 것입니다. 또는 2016 년 주문 1500 건이 처음부터 잘못되었습니다. (고객의 고객 ID를 선택하십시오) 및 FiscalYear = '2016'이 아닌 고객 ID가 일부 레코드를 제공하는 주문에서 SELECT *를 수행합니까? – xQbert
그래, 나는 다음과 같은 사항을 확인하기 시작할 것입니다 : 귀하의 FiscalYear가 실제로 모든 레코드에 대해 "2016"으로 구별됩니까? 오타가 발생할 가능성이 있습니까? 레코드가 삭제 된 것으로 표시되는 방법 (비트/int 플래그)? –