Пишем на SQL
1.93K subscribers
43 photos
7 videos
12 files
116 links
Уроки по SQL. Изучаем базы данных на примере СУБД ORACLE, MySQL, MS SQL Server, PostgreSql

Мой курс по SQL и базам данных:
https://prime-soft.biz/courses/sql

Связь со мной @iliahohlov
Download Telegram
Спасибо всем за активное участие!

Первый вариант решения предыдущей задачи - это использование оператора MINUS (EXCEPT в MS SQL Server).

С помощью оператора MINUS можно вычесть из набора данных, полученным одним SELECT-ом, строки, полученные другим SELECT-ом:

SELECT * FROM TABLE_A
MINUS
SELECT * FROM TABLE_B

Ещё одним простым решением этой задачи будет использование LEFT JOIN-а для проверки наличия данных для таблицы TABLE_A в таблице TABLE_B.
👍9
Сегодня помогал представителю клиента из Германии с одним запросом. Предлагаю аналогичную задачу и Вам (для гуру):

Есть таблица, содержащая некоторые суммы начислений, пусть называется TABLE_INVOICES, имеющая, среди прочих, следующие поля:
...
PERIOD NUMBER,
AMOUNT NUMBER,
...

В них хранится информация вида:
PERIOD AMOUNT
202403 100.78
202404 90.12
202405 200.51
...

В столбце PERIOD значение года и месяца.

И ещё есть таблица подготовленных коэффициентов для каждого месяца, пусть называется TABLE_KOEF. Имеет, по аналогии с предыдущей таблицей, тоже столбец PERIOD, содержащий год и месяц.

Содержит информацию вида:
PERIOD KOEF
202402 1
202403 0.5
202404 0.75

В таблице TABLE_KOEF столбец PERIOD является первичным ключом.

И теперь что нужно сделать: вывести все записи из таблицы TABLE_INVOICES, и для каждой строки рассчитать произведение значения столбца AMOUNT на коэффициент предыдущего месяца из таблицы TABLE_KOEF.

Буду рад Вашему активному участию! Буду ждать решения и вопросы (если что-то не понятно написал).
👍3
Спасибо всем за отличные решения!

В нашем случае мы переводили числовые значения года и месяца столбца PERIOD таблицы TABLE_KOEF к ДАТЕ, потому что к датам можно очень легко прибавить месяц (или указанное количество месяцев). Далее обратно преобразовывали полученные даты (в которых было уже на месяц больше) в числовой формат, состоящий опять из номера года и месяца. Полученные расчётные значения мы использовали для соединения с таблицей TABLE_INVOICES. Решили как раз способом, который написал Georgi Fofanov. Только нам нужно было месяц прибавить к тому, что имелось в столбце PERIOD таблицы TABLE_KOEF.

Способ просто прибавить число 1 к значениям столбца PERIOD не подходит, так как, например, прибавление 1 к значению 202312 даст 13ый месяц, а, в этом случае, нам необходимо прибавление года, а значение месяца должно быть единичкой.

Способ с применением аналитических функций, позволяющих брать значение коэффициента со смещением строки, к сожалению, не рассматривали, так как для некоторых значениев PERIOD коэффициенты могли отсутствовать. Эту деталь, к сожалению, не написал в постановке задачи.

Ещё раз всех благодарю за участие!
👍31
Всем доброго понедельника!

Предлагаю очередную интересную задачу. В этот раз не столько на знания SQL, сколько на знания основ математики.

Могут ли быть при каких-либо значениях ширины (столбец Width), длины (Столбец Length) или высоты (столбец Height) разными значения в столбцах Total_Size1 и Total_Size2?
👍1
Select Round (p.Width * p.Length * p.Height) * p.Items_Count  Total_Size1,
            Round (p.Width * p.Length * p.Height * p.Items_Count)  Total_Size2
  From Positions p
Anonymous Quiz
33%
Нет, при любых значениях Width, Length и Height, результат в Total_Size1 и Total_Size2 одинаков
67%
Да, при некоторыз значениях Width, Length или Height, результат в Total_Size1 и Total_Size2 разный
👍1
Добрый вечер, дорогие друзья!

Хочу поделиться новым отзывом, который недавно получили от одного из наших учеников! С разрешения ученика публикую его здесь!

Здравствуйте, Илья. Меня Шолпан зовут. Я ваша бывшая студентка. Сегодня я получила оффер (как сейчас модно говорить). Моя работа будет связана непосредственно с SQL. Работодатель, перед собеседованием скинул мне на почту задания по SQL, которые я с легкостью решила. Хочу вам сказать, человеческое спасибо, за то, что вы так доходчиво объясняли материал (а курсов по SQL, я пересмотрела много). Также благодарю Юлию, которая мне помогала с домашними заданиями. После ваших курсов, после полученного багажа знаний, я начала изучать Python, хочу отметить, что я с таким наслаждением слушала преподавателя, потому что мне, основные термины в программировании были понятны, тоесть я не лезла в интернет, что бы находить значение слов, а с удовольствием слушала лектора и получала новые знания.

В понедельник приступаю к новой работе, работать буду с sql. Я выросла на ступень выше. Благодарю вас за ваш талант преподавателя. Успехов вам в вашей работе и семейного счастья.
🔥21👍9
Добрый день, друзья!

Предлагаю очередную задачу по SQL. Есть два запроса.

Запрос 1:
SELECT o.*,
(SELECT COUNT(*)
FROM ORDER_ITEMS
WHERE ID_ORDER = o.ID) AS COUNT_ITEMS
FROM ORDERS o
WHERE o.ID = 10

Запрос 2:
SELECT o.*,
COALESCE( (SELECT COUNT(*)
FROM ORDER_ITEMS
WHERE ID_ORDER = o.ID), 0) AS COUNT_ITEMS
FROM ORDERS o
WHERE o.ID = 10
👍5
В таблице ORDER_ITEMS нет строк со значением 10 в столбце ID_ORDER. Результат выполнения обеих запросов:
Anonymous Quiz
56%
будет одинаков
44%
будет разный
This media is not supported in your browser
VIEW IN TELEGRAM
Видео от Ilia Khokhlov
🔥11👍7
Всем доброй пятницы и хороших выходных!
9
Доброе утро, друзья!
Всем хорошего понедельника и продуктивной недели!

Спасибо, что продолжаете делиться интересными задачами по SQL.

Предлагаю поучаствовать в решении ещё одной задачи, которая поступила в прошлую пятницу. Текст задачи немного переделал и конкретизировал.

Дана таблица ACCOUNTS, содержащая данные о счетах клиентов (у клиента может быть несколько счетов). Среди прочих, в таблице ACCOUNTS есть следующие важные для нас столбцы:
        ID_CLIENT - идентификатор клиента
        DT_OPEN – дата открытия счета
        DT_CLOSE – дата закрытия счета

Если дата закрытия счёта не заполнена (содержит значение NULL), то счет открыт на текущий день.

Требуется написать SQL-запрос, который должен посчитать количество клиентов с открытым счетом помесячно. Учитывать только счета, которые были открыты более одного дня. При решении нельзя использовать оператор DISTINCT.

Если счёт открыт в марте и закрыт в мае, то клиент с таким счетом должен войти в количество клиентов с открытым счетом во всех месяцах с марта по май включительно.

Отчёт должен быть вида:

Год      Месяц        Колво откр.клиентов
2005    январь         23
2005    февраль      89
2005    март            167
....

Попозже опубликую один из вариантов решения!
Пишем на SQL
Доброе утро, друзья! Всем хорошего понедельника и продуктивной недели! Спасибо, что продолжаете делиться интересными задачами по SQL. Предлагаю поучаствовать в решении ещё одной задачи, которая поступила в прошлую пятницу. Текст задачи немного переделал…
Всем доброго вторника!

По предыдущей задаче скоро возьму и сделаю видеоразбор единственного присланного решения! Интересное решение придумал Виталий! Кто-то попытался вникнуть в то, как была решена задача? 😉
Мощно, да?! Скоро сделаю видеоразбор!
👍3
Всем доброго вечера!

Наконец, нашёл время разобрать решение предыдущей задачи, присланное Виталием!

Виталий, спасибо за участие!

Изначально собирался подготовить небольшое видео разбора решения (именно видео), но, в итоге, решил ограничиться текстовым вариантом. Надеюсь не повлияет на восприятие.

Начинается решение с созданием CTE (временной таблицы данных, которой будет дано собственное имя и которая будет "жить" пока выполняется скрипт получения данных). Про CTE я уже записывал небольшое видео здесь: https://youtu.be/xuoIfDBKI7I

Инструкция WITH отбирает в набор данных счета, с даты открытия по дату закрытия которых прошло более одного дня. При отсутствии даты закрытия рассчитывается по текущую дату. И называется это потом "t".

И вот дальше самое интересное 😀 к полученному набору данных "t" коннектятся данные этого же набора данных своего клиента по количеству раз, равным количеству месяцев, на протяжении которых был открыт счёт. Может быть здесь немного переделать и соединять по идентификатору счета (должен же быть такой столбец в таблице счетов)?
Очень любопытно: ORACLE оценил план выполнения запроса как достаточно нетрудоёмкий, но я не смог дождаться результата выполнения запроса (ждал более 10ти минут). Я бы, всё же, немного переделал запрос по части размноживания (дублирования) строк каждого счета по количеству месяцев в котором он был открыт на способ с помощью обычного джоина. К таблице счетов, или CTE с именем "t" можно приджоинить динамически созданную таблицу месяцев. К каждому счету можно приджоинить столько месяцев, сколько счёт был открыт. То есть идея такая же, но использование обычного джоина заместо сложного CONNET BY заметно (иногда очень заметно) упростит выполнение запроса!

Спасибо большое за внимание к задаче и участие в её решении!
1👍1
В базе данных есть таблица VOUCHERS, в которой, среди прочих, есть столбец ID_CODE, определённый как INT NOT NULL.
В таблице всего три строки со значением 1 (один) в этом столбце, у остальных строк в этом столбце другое значение.
👍4
Сколько строк вернёт следующий запрос:

SELECT * FROM VOUCHERS WHERE ID_CODE IN (1, NULL)
Anonymous Quiz
17%
1
55%
3
5%
0
22%
Запрос не выполнится. Будет SQL-ошибка.
👍1🔥1
Усложненная версия предыдущей задачи

В базе данных есть таблица VOUCHERS, в которой, среди прочих, есть столбец ID_CODE, определённый как NUMBER (с возможностью сохранения значений NULL).

В таблице всего пять строк.
У трёх строк значение 1 (один) в этом столбце, и ещё у двух строк значение в этом столбце NULL.
👍2
Сколько строк вернёт следующий запрос:

SELECT * FROM VOUCHERS WHERE ID_CODE IN (1, NULL)
Anonymous Quiz
30%
3
46%
5
7%
0
18%
Запрос не сможет выполняться. Будет SQL-ошибка
В каком порядке выводятся данные, получаемые SQL-запросом, если в запросе не указан ORDER BY?

- данные выводятся в таком порядке, в котором их проще вывести для СУБД. При отсутствии блока ORDER BY один и тот же запрос, запускаемый в разное время, даже может выводить одни и те же данные в разном порядке.
6👌5🔥1
Всем привет!

А вот и задача на этот понедельник! По сложности назначаю 1 звёздочку! Проверьте себя, ничего не забыли из основы основ? И внимательно читаем условие задачи, ато обидно будет ответить не правильно на достаточно простой задаче 😉

Таблица PERS определена следующим образом:
(ID NUMBER NOT NULL PRIMARY KEY,
NAME VARCHAR(100) NOT NULL)

Запрос
SELECT COUNT(*)
FROM PERS
WHERE NAME = 'Иванов Иван Иванович'
возвращает число 2.
🔥2