SQL

Помогите пожалуйста составить sql запрос

Тренер дал задачу. Но я не пойму как ее сделать, хотя я вроде бы всё учила. Почему в данных таблицах нету количества заказов, и почему client id и client id так сильно различаются?
Вам даны выдержки таблиц - т.е. НЕполные таблицы, а несколько рандомных записей. Реально в них могут быть миллионы строк.
 select c.lastname, c.firstname, cc.count_orders  
from client c
join (
select c.clientid, count(o.orderid) as count_orders
from orders o
join client c on o.clientid = c.clientid
where orderdate between date'2015-01-01' and date'2016-01-01'
group by c.clientid
having count(o.orderid) > 25
) cc on c.clientid = cc.clientid
order by cc.count_orders desc
Andrei Grebennikov
Andrei Grebennikov
55 095
Лучший ответ
Тебе уже объясняли - это фрагменты таблиц. На самом деле в них должно быть гораздо больше данных. Тогда и соответствия ключей будут, и все остальное. А ты, похоже, пытаешься найти 25 записей при 6 данных - вот у тебя ничего и не выходит.
Иван Иванов
Иван Иванов
68 602
Тебе Jurijus Zaksas уже давал текст запроса - в прошлой копии твоего вопроса. Но если в прошлый раз не хватило, то та же самая идея в немного иной реализации:
 SELECT MAX(c.LastName), MAX(c.FirstName), COUNT(o.OrderID)
FROM Client AS c
INNER JOIN Orders AS o
ON o.ClientID = c.ClientID
WHERE o.OrderDate BETWEEN '2015-01-01' AND '2015-21-31'
GROUP BY c.ClientID
HAVING COUNT(o.OrderID) > 25
ORDER BY COUNT(o.OrderID) DESC
Всё остальное, перечисленное в твоём вопросе, ты можешь узнать самостоятельно - открыв любой учебник SQL (коих на Озоне как грязи) и начав его читать.
Эргаш Усманов Именно ваш запрос ме ясен, спасибо. То естьв конечном результате будет таблица с названием столбцов C и О, где в C обьеденены имена и фамилии а в О количество заказов? Почему *ON o.ClientID = c.ClientID* тут перед clienID стоит O а затем C? на самих уроках просто не было такого, что ставяться какие то буквы перед названием столбцов. Почему пишеться having? я так и не поняла из sqlbolt значение хэвинг. Я бы написала where orderid>25

Изначально я не понимала задание так как там не хватало столбца с количеством заказов, я зашла на 6 урок sqlbolt и решила попробовать визуализировать, не знаю, переменные, ну подменить на уроке чтобы сделать тот самый запрос.
Эргаш Усманов https://sqlbolt.com/lesson/select_queries_with_joins
SELECT title, director, year FROM movies
inner join boxoffice on ID=movie_id
where year >2005 and rating like "8%"
order by year desc;
То есть я пыталась думать логически, и если перейти на урок и вписать данный запрос то по идее, всё что от меня требовалось в задании прекрасно отображаеться на таблице
Эргаш Усманов Извините еще раз. Я пытаюсь разобраться чтобы сдать это задание понимая его.
Другие люди советовали делать extract но я sqlbolt я пытался его использовать не поняла как он работает. Собственно вопросы, логичнее было бы использовать using после join, мне подказали что если название столбцов одинаковое мжно использовать using.
Мне не понятно как использовать эти алиасы, опять же я пробовал их поиспользовать в sqlbolt то там инкорект кьюри. Просто мы не проходили это на уроках, наврядли в моём конечном ответе должны быть эти алиасы.
Насчёт between полностью согласна.
Что значит max в поле селект? и почему там сразу прописаны алиасы, система ведь будет ругаться что типо *нет такой строчки как o.LastName
количество заказов тебе самой надо посчитать.
А client id отличается, потому что в таблице заказов он не обязан быть уникальным, и не все клиенты делали ровно по одному заказу в порядке возрастания.
как вариант

select o2.id ,c.lastname,c.firstname,o2.cnt

from (
select o.clientid,count(o.orderid) as cnt
from orders o
where extract(year from o.orderdate)=2015
group by 1
having count(o.orderid)>25
) o2

left join client c on c.clientid=o2.clientid
order by 4 desc
Вадим Сомов
Вадим Сомов
3 029