2017-03-19 88 views
1

我正在搞亂WideWorldImporters數據庫Microsoft給人們學習SQL(試圖讓它更好,因爲我經常在工作中使用SQL)。我試圖得到2013年所有國家銷售額的總和。即使沒有匹配條件,SQL也顯示所有行

我把那一起罰款,但問題是,有幾個國家沒有任何上市,並沒有出現在列表中。我如何讓他們出現,併爲他們的銷售只有0?從我發現的情況來看,這與JOIN有關,但是我已經搞亂了各種類型,而且似乎沒有辦法。正如你所看到的,我也試過了一個也沒有幫助的CASE。任何提示將非常感謝!

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表,做這項工作更好:

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 

您還應該使用YYYYMMDD日期格式,而不是其他人可以被誤解,看到這個question

+0

這解決了它謝謝你! – user3066571

0

在這種情況下,您也可能正在尋找LEFT JOIN。如果兩個表中都存在匹配項,則Full Join將爲您提供連接兩側的表中的所有記錄。這將爲您提供Application.StateProvinces中沒有匹配記錄的城市,訂單,客戶和訂單項次。

通過使用FULL JOIN而不是LEFT JOIN,您將在StateProvinceName列中返回空值。

相關問題