我正在搞乱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
正如您所看到的,销售额是从州名中删除的许多表格,我不知道这是否会使问题复杂化。
答案 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
列中返回空值。