代码查询结果问题,使用 AdventureWorks 和 SQL 服务器

Problems With Code Query Results, Using AdventureWorks & SQL Server

我正在使用 AdventureWorks2012 数据库和 Microsoft SQL Server 2012。我正在尝试 return SalesOrderID、订单日期的年份和月份、到期总计、区域组、区域名称、州运送订单至,以及分配给订单的销售代表的名字和姓氏。我使用了一堆连接,这就是我在下面的代码中所拥有的。

SELECT          OH.SalesOrderID AS SalesOrderID,
                YEAR(OH.OrderDate) AS [Year], 
                MONTH(OH.OrderDate) AS [Month], OH.TotalDue AS TotalDue,
                ST.[Group] AS [Group], 
                ST.Name AS TerritoryName, SP.Name AS ShipState, 
               (SalesP.FirstName + ' ' + SalesP.LastName) AS SalesRepName
FROM            Sales.SalesOrderHeader OH
INNER JOIN      Sales.SalesTerritory ST
ON              OH.TerritoryID = ST.TerritoryID
INNER JOIN      Sales.vSalesPerson SalesP
ON              OH.SalesPersonID = SalesP.BusinessEntityID
INNER JOIN      [Person].[StateProvince] SP
ON              ST.TerritoryID = SP.TerritoryID
INNER JOIN      [Person].[Address] A
ON              OH.ShipToAddressID = A.AddressID
GROUP BY        OH.SalesOrderID, OH.OrderDate, 
                OH.TotalDue, ST.[Group], ST.Name, 
                SP.Name, SalesP.FirstName, SalesP.LastName

当我执行以下代码时,我得到了一堆 SalesOrderID 记录,它似乎将每个可能的 Ship State 命名为记录。基本上我得到了比我应该得到的更多的记录。我不完全确定我的代码做错了什么,我觉得我的连接是正确的,但我没有得到准确的数据。我正在寻找每个 SalesOrderID 返回 1 个结果,不多。任何帮助将不胜感激。

您可能发现您的小组正在这样做。你能发送你的结果屏幕吗?抱歉,没有安装该演示数据库。

谢谢

我觉得你的问题可能在于

INNER JOIN      [Person].[StateProvince] SP
ON              ST.TerritoryID = SP.TerritoryID

记住模式结构看起来是一样的,但我安装了 Adventure Works 2014,以下内容应该可以解决您的问题并将每个销售订单的结果集减少到 1 个。

    INNER JOIN      [Person].[StateProvince] SP
    ON              ST.TerritoryID = SP.TerritoryID
    AND             SP.StateProvinceID = A.StateProvinceID

您所拥有的联接将 Salesterritory 中的单个 territoryID 与 Stateprovince 中的每个匹配条目相关联。额外的 AND 仅强制发货地址 (Address table) 中的 Stateprovince 与相应的单个 stateprovince 匹配,并为每个订单提供单个结果。我得到了 3806 条记录的结果集。

另请注意,您使用 INNER JOINS 意味着您只是 return 订单的一个子集。这可能确实正是您所需要的,但如果您需要 return 每个销售订单,请更改以下连接。

LEFT JOIN      Sales.vSalesPerson SalesP