2017-03-19 6 views
1

WideWorldImporters 데이터베이스가 엉망입니다. Microsoft는 SQL을 배우는 사람들에게 (나는 직장에서 SQL을 자주 사용하므로 더 잘 이해하려고 노력합니다.일치하는 기준이 없어도 모든 행을 표시합니다.

나는 잘 정리했는데, 문제는 나열되어 있지 않은 여러 주들이 있고 나타나지 않는다는 것입니다. 목록에. 어떻게 그들을 보여주게하고 그들의 판매에 0을 가지고 있습니까? 내가 찾은 바에 따르면, 이것은 JOIN과 관련이 있지만, 다양한 유형으로 엉망이되어 버렸고 트릭을 수행하지 않는 것 같습니다. 보시다시피, 나는 또한 도움이되지 않은 사례를 시도했습니다. 모든 팁 크게 감사하겠습니다! 그 문제를 복잡하게하면 당신이 볼 수 있듯이

SELECT 
    StateProvinceName, 
    CASE WHEN SUM(Quantity * UnitPrice) IS NULL 
     THEN '0' ELSE SUM(Quantity * UnitPrice) * (AVG(TaxRate)/100 + 1) END AS Sales 
FROM 
    Application.StateProvinces 

    FULL JOIN Application.Cities 
     ON Application.StateProvinces.StateProvinceID = Application.Cities.StateProvinceID 
    FULL JOIN Sales.Customers 
     ON Application.Cities.CityID = Sales.Customers.DeliveryCityID 
    FULL JOIN Sales.Orders 
     ON Sales.Customers.CustomerID = Sales.Orders.CustomerID 
    FULL JOIN Sales.OrderLines 
     ON Sales.Orders.OrderID = Sales.OrderLines.OrderID 

WHERE OrderDate >= '2013-01-01' 
AND OrderDate < '2014-01-01' 

GROUP BY StateProvinceName 
ORDER BY Sales DESC 

, 판매 금액은 상태 이름에서 제거 많은 테이블이, 나도 몰라.

답변

1

부분에 뭔가를 추가하면 해당 테이블이 나머지 쿼리와 내부 조인됩니다. 여기에 문제가 있다고 생각됩니다. 날짜가 Orders 테이블에있는 가정하면,이 작품 더 나은 수행합니다 당신은이 question를 참조하는 대신, 다른 사람이 잘못 해석 될 수 YYYYMMDD 날짜 형식을 사용한다

FROM Application.StateProvinces 
FULL JOIN Application.Cities 
    ON Application.StateProvinces.StateProvinceID = Application.Cities.StateProvinceID 
FULL JOIN Sales.Customers 
    ON Application.Cities.CityID = Sales.Customers.DeliveryCityID 
FULL JOIN Sales.Orders 
    ON Sales.Customers.CustomerID = Sales.Orders.CustomerID 
    and OrderDate >= '2013-01-01' AND OrderDate < '2014-01-01' 
FULL JOIN Sales.OrderLines 
    ON Sales.Orders.OrderID = Sales.OrderLines.OrderID 

.

+0

이 문제가 해결되었습니다. – user3066571

0

이 경우 LEFT JOIN을 찾고있을 수도 있습니다. Full Join은 두 테이블에 일치하는 항목이있을 경우 조인의 양쪽에있는 테이블의 모든 레코드를 제공합니다. 이렇게하면 Application.StateProvinces에 일치하는 레코드가없는 도시, 주문, 고객 및 주문 행이 제공됩니다.

LEFT JOIN 대신 FULL JOIN을 사용하면 StateProvinceName 열에 Null 값을 반환합니다.