2017-03-19 63 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列中返回空值。

相关问题