代码查询结果问题,使用 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
我正在使用 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