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

Sql server SQL显示所有行,即使没有匹配条件,sql-server,join,case,Sql Server,Join,Case,我正在摆弄微软为学习SQL的人提供的WideWorldImporters数据库(我经常在工作中使用SQL,所以我会尝试更好地使用它)。我正试图得到2013年州政府所有销售额的总和 我很好地收集了这些信息,但问题是,有几个州没有列出任何信息,也没有出现在列表中。我如何让他们出现,并为他们的销售打0分?从我发现的情况来看,这与连接有关,但我弄乱了各种类型的连接,但它似乎不起作用。正如你所看到的,我也试过一个同样没有帮助的案子。任何提示都将不胜感激 SELECT StateProvinceN

我正在摆弄微软为学习SQL的人提供的WideWorldImporters数据库(我经常在工作中使用SQL,所以我会尝试更好地使用它)。我正试图得到2013年州政府所有销售额的总和

我很好地收集了这些信息,但问题是,有几个州没有列出任何信息,也没有出现在列表中。我如何让他们出现,并为他们的销售打0分?从我发现的情况来看,这与连接有关,但我弄乱了各种类型的连接,但它似乎不起作用。正如你所看到的,我也试过一个同样没有帮助的案子。任何提示都将不胜感激

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
选择
StateProvinceName,
总和(数量*单价)为空时的情况
然后“0”的其他总和(数量*单价)*(平均(税率)/100+1)作为销售额结束
从…起
应用程序。美国各省
完全加入申请。城市
在Application.StateProvinceID=Application.Cities.StateProvinceID上
全面加入销售。客户
ON Application.Cities.CityID=Sales.Customers.DeliveryCityID
完全加入销售。订单
ON Sales.Customers.CustomerID=Sales.Orders.CustomerID
完全加入Sales.OrderLines
ON Sales.Orders.OrderID=Sales.OrderLines.OrderID
其中OrderDate>=“2013-01-01”
订单日期<'2014-01-01'
按州分组ProvinceName
按销售说明订购

如您所见,sales amounts是许多从州名称中删除的表,我不知道这是否会使问题复杂化。

当您在where part中添加某些内容时,会导致该表与查询的其余部分进行内部联接,我想这就是您的问题所在。假设日期在
订单
表格中,这是否更有效:

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
来自Application.state的

完全加入申请。城市
在Application.StateProvinceID=Application.Cities.StateProvinceID上
全面加入销售。客户
ON Application.Cities.CityID=Sales.Customers.DeliveryCityID
完全加入销售。订单
ON Sales.Customers.CustomerID=Sales.Orders.CustomerID
订单日期>='2013-01-01'和订单日期<'2014-01-01'
完全加入Sales.OrderLines
ON Sales.Orders.OrderID=Sales.OrderLines.OrderID

您还应该使用
YYYYMMDD
日期格式,其他格式可能会被误解,请参见此。

在这种情况下,您也可能正在寻找
左连接。如果两个表中是否存在匹配项,则
完全联接将为您提供联接两侧表中的所有记录。这将为您提供在
应用程序中没有匹配记录的城市、订单、客户和订单行

通过使用
完全联接
而不是
左联接
,您将在
StateProvinceName
列中返回空值