Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.08.2016, 19:00   #1
VladimirKas
Новичок
Джуниор
 
Регистрация: 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'

Подскажите пжл, где я ошибаюсь
VladimirKas вне форума Ответить с цитированием
Старый 11.08.2016, 22:03   #2
predefined
Форумчанин
 
Регистрация: 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. Подставьте правильное сами
predefined вне форума Ответить с цитированием
Старый 12.08.2016, 00:44   #3
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

не понятно при чем тут use left join ..
но вообще то так количество получить можно если только потом на пальцах загибать
еще про BETWEEN надо почитать
come-on вне форума Ответить с цитированием
Старый 12.08.2016, 08:30   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,881
По умолчанию

Если почитать задание, то видно, что для данного конкретного запроса, таблица ордердитейлов не нужна. Про алиасы(мнемонические имена) выше верно сказано, задействую у себя для удобства.
Ошибку я вижу прежде всего в том, что джойните по условию 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 декабря - может учитываться как только на начало дня, так и до конца, а функция года от всего этого страхует, да и параметризовать проще будет (если запрос выполняется из программы/хранимой процедуры).
phomm вне форума Ответить с цитированием
Старый 12.08.2016, 12:48   #5
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Цитата:
Лефт джоин тут при том, что надо вывести не тех имплоиев, у которых были заказы, а вывести всех имплоиев с их количеством заказов,
аа, ну тогда ок
come-on вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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