我正在使用AdventureWorks2012数据库和Microsoft SQL Server 2012.我试图返回SalesOrderID,Year&订单日期,到期总额,地域组,地区名称,州运输订单以及分配给订单的销售代表的名字和姓氏。我使用了一堆连接,这就是我在下面的代码中所拥有的。
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个结果,而不是很多。任何帮助将不胜感激。
答案 0 :(得分: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中的单个borderID与Stateprovince中的每个匹配条目相链接。额外的AND只强制来自船舶地址(地址表)的Stateprovince与相应的单个stateprovince匹配,并为每个订单提供单个结果。我得到了3806条记录的结果集。
另请注意,您使用INNER JOINS意味着您只返回订单的子集。这可能确实正是您所需要的,但如果您需要返回每个销售订单,请更改以下联接。
LEFT JOIN Sales.vSalesPerson SalesP
答案 1 :(得分:0)
您可能会发现您的小组正在这样做。你能发一个结果屏幕吗?抱歉,没有安装该演示数据库。
由于