2016-02-20 42 views
0

我正在使用AdventureWorks2012数据库和Microsoft SQL Server 2012.我试图返回SalesOrderID,&月份的订单日期,到期总额,地区组,地区名称,州运费订单,以及分配给订单的销售代表的姓名。我使用了一堆连接,这就是我在下面的代码中所拥有的。代码查询结果的问题,使用AdventureWorks和SQL Server

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记录,似乎说出每一个可能的运送状态的记录。基本上我得到更多的记录,然后我应该。我不完全确定我在代码中做了什么错误,我觉得我的连接是正确的,但我没有获得准确的数据。我正在寻找每个SalesOrderID有1个结果,而不是很多。任何帮助,将不胜感激。

回答

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在Stateprovince所有匹配的条目链接的单一的TerritoryID的加盟。额外的AND仅强制船舶地址(地址表)中的Stateprovince与相应的单一stateprovince相匹配,并为每个订单提供单个结果。我得到了3806条记录的结果集。

请注意,您使用INNER JOINS意味着您只返回一部分订单。这可能确实正是你所需要的,但是如果你需要返回每一个销售订单,那么改变下面的连接。

LEFT JOIN  Sales.vSalesPerson SalesP 
+0

非常感谢你戴夫!我知道我在正确的道路上,但卡住了。感谢它的帮助和解释! – smul86

0

你可能发现你的团队正在做这件事。你可以发送结果的屏幕?对不起,没有安装该演示数据库。

感谢