|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
11.08.2016, 19:00 | #1 |
Новичок
Джуниор
Регистрация: 11.08.2016
Сообщений: 1
|
написать запрос c LEFT JOIN
Есть БД с таблицами Employees/Orders/Order Details
Show first and last names of the employees as well as the count of orders each of them have received during the year 1997 (use left join). Это мое решения в котором я не могу понять где ошибка: SELECT FirstName, LastName, Quantity FROM Orders LEFT JOIN Employees ON Orders.OrderID=Employees.EmployeeID JOIN [Order Details] ON [Order Details].OrderID=Orders.OrderID WHERE OrderDate BETWEEN '1997-01-01' AND '1997-12-31' Подскажите пжл, где я ошибаюсь |
11.08.2016, 22:03 | #2 |
Форумчанин
Регистрация: 01.08.2016
Сообщений: 182
|
Попробуйте задать таблицам мнемонические имена:
SELECT E.FirstName, E.LastName, O.Quantity FROM Orders AS O LEFT JOIN Employees AS E ON O.OrderID=E.EmployeeID JOIN [Order Details] AS OD ON OD.OrderID=O.OrderID WHERE O.OrderDate BETWEEN '1997-01-01' AND '1997-12-31' Не уверен на счёт O.Quantity - не знаю из какой таблицы это поле O/E/OD. Подставьте правильное сами |
12.08.2016, 00:44 | #3 |
Участник клуба
Регистрация: 21.10.2015
Сообщений: 1,361
|
не понятно при чем тут use left join ..
но вообще то так количество получить можно если только потом на пальцах загибать еще про BETWEEN надо почитать |
12.08.2016, 08:30 | #4 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,882
|
Если почитать задание, то видно, что для данного конкретного запроса, таблица ордердитейлов не нужна. Про алиасы(мнемонические имена) выше верно сказано, задействую у себя для удобства.
Ошибку я вижу прежде всего в том, что джойните по условию O.OrderID=E.EmployeeID - это разные айди (путатете мухи и котлеты, а движок субд Вам, скорее всего, не скажет, что это ошибка, т.к. для него это просто сравнение чисел), а надо, думаю, так: O.EmployeeID=E.EmployeeID Во-вторых, нет подсчета количества (о чём, опять же, уже сказано выше) т.к. Ваш запрос выведет просто все заказы (ещё непонятно что за quantity вообще), а чтобы это сделать, надо произвести группировку по E.EmployeeID, E.FirstName, E.LastName и вывести COUNT(O.OrderID) AS Quantity. Лефт джоин тут при том, что надо вывести не тех имплоиев, у которых были заказы, а вывести всех имплоиев с их количеством заказов, отсюда следует, что надо ставить во главу таблицу имплоиев и к ней лефтджойнить заказы, в итоге подсчёт количества для имплоиев без заказов вернёт 0 (подсчет именно по полю заказов). Ну и третья тонкость, как уже тоже сказали, это условие (предикат) в Where - я бы предложил использовать функцию от даты вычленяющую год, в субдшках они обычно есть, некая YEAR() , а between от точной даты менее гибкое решение, плюс формат даты зашивается в запрос (что не есть гуд), ну и может быть в разных субд для разных типов поля даты (date/datetime) тонкость в сравнении остатка дня 31 декабря - может учитываться как только на начало дня, так и до конца, а функция года от всего этого страхует, да и параметризовать проще будет (если запрос выполняется из программы/хранимой процедуры). |
12.08.2016, 12:48 | #5 | |
Участник клуба
Регистрация: 21.10.2015
Сообщений: 1,361
|
Цитата:
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
LEFT JOIN | januarist | SQL, базы данных | 6 | 23.07.2015 12:15 |
Запрос к БД с использованием LEFT JOIN | MaGWaY_minsk | SQL, базы данных | 6 | 07.02.2014 15:24 |
LEFT JOIN | kuba1981 | SQL, базы данных | 3 | 21.11.2013 08:00 |
запрос с left join | KatrinSecret | SQL, базы данных | 2 | 18.01.2012 22:31 |
LEFT JOIN | acidcool | SQL, базы данных | 12 | 20.08.2009 19:23 |