Нужна помощь с базовым запросом sql

Я делал некоторые упражнения для практики, и у меня возникла небольшая проблема с моим запросом. Мой исходный код ниже. Проблема в том, что я получаю неправильный ответ в последнем столбце/

Вопрос: запрос, чтобы узнать общий объем продаж, приписанный каждому продавцу для всех SalesOrders, размещенных в 2008 году. Используйте TotalDue заказов, чтобы найти суммы продаж, и SalesPersonID, чтобы найти продавца для атрибута. Например. SalesOrderID 43659 следует отнести к SalesPersonID 279.

  SELECT DISTINCT p.BusinessEntityID,p.FirstName,p.LastName,  t.TotalDue
    FROM Person.Person p,Sales.SalesPerson s,Sales.SalesOrderHeader t
    WHERE p.BusinessEntityID = s.BusinessEntityID 

Вот изображение моего ERD http://www.2shared.com/photo/h2-jMQyP/AdventureWorks2008.html .


person Rohit Pradeep    schedule 27.03.2012    source источник
comment
если возможно, опубликуйте некоторые образцы данных с желаемым результатом .. так что было бы полезно правильно сказать запрос .. :)   -  person pratik garg    schedule 27.03.2012
comment
Поскольку вы учитесь, по крайней мере учитесь правильно, никогда не используйте неявные соединения. Это очень плохая техника программирования.   -  person HLGEM    schedule 27.03.2012


Ответы (2)


Это выглядит как идеальный пример использования предложения GROUP BY.

Попробуйте следующий запрос:

select p.BusinessEntityID, p.FirstName, p.LastName, sum(t.TotalDue) as TotalDue
from Person.Person p
join Sales.SalesPerson s on p.BusinessEntityID = s.BusinessEntityID
join Sales.SalesOrderHeader t on t.BusinessEntityID = s.BusinessEntityID
where year(t.OrderDate) = 2008
group by p.BusinessEntityID, p.FirstName, p.LastName
person Cristian Lupascu    schedule 27.03.2012

если вы хотите, чтобы totaldue был сделан в 2008 году, вы должны указать еще одно условие для части этого года

SELECT DISTINCT p.BusinessEntityID,p.FirstName,p.LastName,  t.TotalDue
FROM Person.Person p,Sales.SalesPerson s,Sales.SalesOrderHeader t
WHERE p.BusinessEntityID = s.BusinessEntityID 
and year(date_column) = '2008'
person pratik garg    schedule 27.03.2012
comment
я все еще не понимаю столбец продаж неправильно, это то, что у меня было SELECT p.BusinessEntityID, p.FirstName, p.LastName, s.TotalDueFROM Person.Person p, Sales.SalesOrderHeader sWHERE p.BusinessEntityID = s.SalesPersonID AND YEAR (OrderDate ) = '2008';. - person Rohit Pradeep; 27.03.2012
comment
Я думаю, что этот запрос возвращает декартово произведение между Person/SalesPerson с одной стороны и SalesOrderHeader с другой. Это потому, что нет условия соединения с таблицей SalesOrderHeader. - person Cristian Lupascu; 27.03.2012
comment
-1 для пользователя неявных соединений и за то, что в результате не распознано случайное перекрестное соединение. - person HLGEM; 27.03.2012
comment
@HLGEM примите вашу точку зрения ... но посмотрите, что я пытался сказать, это добавить часть года при проверке / извлечении данных. .. - person pratik garg; 27.03.2012