即使没有匹配条件,SQL也显示所有行

时间:2017-03-19 05:09:36

标签: sql-server join case

我正在搞乱WideWorldImporters数据库微软为人们学习SQL提供了帮助(试图改善它,因为我经常在工作中使用SQL)。我试图获得2013年各州销售额的总和。

我把它弄得很好,但问题是,有几个州没有列出,也没有出现在列表中。如何让它们出现并且只有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

正如您所看到的,销售额是从州名中删除的许多表格,我不知道这是否会使问题复杂化。

2 个答案:

答案 0 :(得分:1)

当您向部分添加内容时,它会使该表内部加入查询的其余部分,我猜这是您的问题。假设日期在combineLatest表中,这样做会更好:

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 日期格式,其他格式可能会被误解,请参阅此question

答案 1 :(得分:0)

在这种情况下,您也可能正在寻找LEFT JOIN。如果两个表中都匹配,Full Join将为您提供联接两侧表格中的所有记录。这将为您提供Application.StateProvinces中没有匹配记录的城市,订单,客户和订单行。

使用FULL JOIN代替LEFT JOIN,您将在StateProvinceName列中返回空值。