2016-02-20 3 views
0

Я использую базу данных AdventureWorks2012 и Microsoft SQL Server 2012. Я пытаюсь вернуть SalesOrderID, год & Месяц даты заказа, общая сумма, территория территории, название территории, State Shipping Order To, а также имя первого и последнего имени отдела продаж, присвоенное заказу. Я использовал кучу объединений, и это то, что у меня есть в коде ниже.Проблемы с результатами запроса кода с использованием 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 записей и, кажется, назвать все возможное Ship государство к записям. В основном я получаю больше записей, чем должен. Я не совсем уверен, что я делаю неправильно в своем коде, я чувствую, что мои соединения правильные, но я не получаю точные данные. Я ищу каждый 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 

Джойн, как вы имели его связывает единый territoryID от Salesterritory с каждым подходящим входом в StateProvince. Дополнительный И заставляет только Stateprovince с адреса судна (адресную таблицу) соответствовать соответствующему одиночному состоянию и предоставлять один результат за заказ. Я получаю набор результатов из 3806 записей.

Обратите внимание, что использование INNER JOINS означает, что вы возвращаете только часть заказов. Это действительно может быть именно то, что вам нужно, но если вам нужно вернуть каждый заказ на продажу, измените следующее соединение.

LEFT JOIN  Sales.vSalesPerson SalesP 
+0

Благодарю вас, Дэйв! Я знал, что я на правильном пути, но застрял. Цените помощь с ней, а также объяснение! – smul86

0

Возможно, вы, вероятно, найдете свою группу, делая это. Можете ли вы отправить экран результатов? Извините, у вас нет установленной демо-версии.

Благодаря