13 упражнений по SQL с решениями
Добрый день! В этом наборе упражнений мы рассмотрим SQL и T-SQL. С помощью этих упражнений мы будем практиковать различные запросы SQL и T-SQL, чтобы помочь вам отточить свои навыки и улучшить понимание этих языков. Независимо от того, являетесь ли вы новичком или опытным пользователем, эти упражнения помогут вам укрепить свои знания и подготовиться к реальным сценариям собеседований. Так что давайте погрузимся в работу и начнём решать задачи!
В моем канале вы найдете подробный разбор SQL задач с собеседований, полезные гайды и уроки для программистов
А здесь целая папка бесплатных полезных ресурсов и каналов.
Поехали!
Задание 1
У меня есть таблица событий. Я хотел бы исключить определённые значения, которые появляются несколько раз. EMI должен появиться только один раз и только первый EMI с 23 марта. Другие дубликаты, такие как EMD, могут остаться.
Вот запрос для создания таблицы и вставки данных:
Решение
Этот запрос может быть полезен для решения представленной выше задачи:
Задание 2
У меня есть таблица с данными о ценах продажи товаров за разные даты.
Как вы можете видеть, желаемый результат заключается в том, чтобы DataEnd была на один день меньше даты следующего изменения цены.
Вот запрос для создания таблицы и вставки данных:
Решение
Этот простейший запрос является решением представленной выше задачи:
Задание 3
У меня есть 3 таблицы, называемые tables, years и codes. Результаты на рисунке ниже приведены для этих трёх таблиц.
Вот запрос для создания таблицы и вставки данных:
Я хочу сделать запрос, который возвращает import для каждого года и для каждого кода, содержащегося в следующих таблицах (return import = 0, где нет записи для определённой комбинации года и кода).
Имея 6 codes и 5 years, я ожидаю 30 записей (по одной для каждой комбинации года и кода) вместе с соответствующим значением import из "@table" для этой комбинации year/ code(или 0, если комбинация не найдена).
Решение
Этот запрос вычисляет общий объём импорта для каждого кода за каждый год в таблицах @years и @codes, используя данные из таблицы @table. Он делает это, используя перекрёстное соединение (CROSS JOIN) для объединения данных из таблиц @years и @codes, а затем использует LEFT JOIN для ввода данных импорта из @table.
Задание 4
Операция удаления выполняется медленно, и перестройка индекса, похоже, не решает проблему. У меня есть простой запрос на удаление:
Таблица ImportLog содержит около 3 миллионов записей. У меня есть некластеризованный индекс, созданный в таблице ImportLog в ImportLogID. Фрагментация составляет менее 10%, но всё равно выполнение запроса занимает больше времени, а когда я перестраиваю индекс вручную, он выполняется в течение секунды. Через день та же проблема повторяется.
Вот план выполнения в поиске лучшего решения данной задачи:
Решение
Проблема заключается не в удалении записей. Проблема заключается в последующем сканировании таблицы оптовой продажи.
Проиндексируйте столбец внешнего ключа в WholesalerSale, чтобы ускорить эту проверку:
Задание 5
У меня есть таблица под названием Employee . Исходя из таблицы ниже, как я могу получить неверный вывод?
Вот запрос для создания таблицы и вставки данных:
Решение
Этот запрос вычисляет общую сумму заработной платы и бонусов для каждого сотрудника в таблице ##Employee . Он делает это с помощью функции SUM в сочетании с регистровым выражением CASE. Выражение CASE проверяет значение столбца PaymentType для каждой строки и возвращает значение столбца Payment, если типом платежа является либо 'Зарплата', либо 'Бонус', в противном случае оно возвращает 0.
Задание 6
У меня есть две таблицы под названием Ingresaron и Salieron:
Мне надо получить такой результат. Как это сделать?
Вот запрос для создания таблицы и вставки данных:
Решение
Этот запрос использует оператор FULL JOIN для объединения данных из таблиц ingresaron и Salieron. Оператор FULL JOIN вернёт все строки из обеих таблиц, даже если в другой таблице нет совпадающих строк.
Задание 7
Удалите дублирующие данные из таблицы person.
Решение
Этот запрос использует общее табличное выражение (CTE) для удаления дубликатов из таблицы person. CTE выбирает столбец name и использует функцию ROW_NUMBER для присвоения уникального номера каждой строке в каждом разделе name. Затем запрос удаляет все строки, в которых столбец row_numbers больше 1. Это эффективно удаляет все повторяющиеся строки для заданного значения имени. Наконец, запрос выбирает оставшиеся значения имён из таблицы person.
Задание 8
У меня есть текущая таблица со столбцами даты и количества. Я хочу получить желаемую таблицу, как показано на рисунке ниже. Уточнение: мне нужно получить общее количество для каждого подъёма, за исключением 2022-12-01 на эту дату.
Вот тестовый код:
Решение
Это запрос, который выбирает столбцы dt и count_sum, причём dt является производным столбцом, который является либо полной датой, либо только месяцем и годом значения даты в столбце date, в зависимости от того, является ли день даты первым днём месяца.
Если днём значения date является первый день месяца, date преобразуется в строку вида 'YYYY-MM-DD' с помощью функции Cast. Если день не является первым днем месяца, функция Format используется для преобразования значения date в строку вида 'YYYY-MM'.
Результаты подзапроса check_date затем группируются по dt, а сумма значений count вычисляется для каждой группы с помощью функции sum. Результирующие строки упорядочиваются по dt в порядке убывания с использованием предложения order by.
Задание 9
У меня есть текущая таблица с Doctor, Case_Number и Field. Мне нужна желаемая таблица из одной строки для каждого Case_Number со столбцами всех типов полей и тем, что каждый врач сделал в каждом конкретном случае.
Вот тестовый код:
Решение
Столбцы Injection, Surgery, H-Test и Discharge выводятся с использованием функции MAX с выражением CASE. Для каждого из этих столбцов выражение CASE вычисляет значение столбца field и возвращает 'X', если оно совпадает с именем выбранного столбца, и ' ' (один пробел), если это не так.
Функция MAX используется для того, чтобы гарантировать, что значение 'X' выбрано, если оно существует, и ' ' выбрано, если его нет. Это связано с тем, что функция MAX вернёт максимальное значение среди своих аргументов, поэтому, если есть значение 'X', оно будет возвращено, а если нет, то вместо него будет возвращено значение ' '.
Результирующие строки группируются по столбцам doctor и case_number, а результирующий вывод будет содержать одну строку для каждой уникальной комбинации значений doctor и case_number, со столбцом для каждого из производных столбцов, показывающим, присутствовало ли соответствующее значение поля в исходной таблице @Cases.
Задание 10
У меня есть текущая таблица с firstDate, LastDate и Code. Я хочу получить желаемую таблицу, как показано на рисунке ниже. Чтобы было понятно, объедините все строки с аналогичным кодом, взяв первую дату из 1-й строки и последнюю дату из последней строки.
Решение
Вот решение:
Задание 11
У меня есть текущая таблица со столбцами countx, code и col3. Я хочу получить желаемую таблицу. Чтобы внести ясность, нужно провести группировку на основе столбца кода и суммировать количество строк по столбцу кода.
Вот тестовый код:
Решение
В этом запросе используется оконная функция SUM() с предложением OVER() и предложением PARTITION BY.
Функция SUM() вычисляет сумму всех значений countx в разделе текущей строки. Функция OVER() определяет окно или набор строк в результирующем наборе запроса. Функция PARTITION BY делит строки в результирующем наборе на разделы, к которым применяется SUM().
Оператор SELECT извлекает сумму countx для каждого code в виде countx_sum, столбца code и столбца col3 из тестовой таблицы. Строки упорядочены по столбцу кода.
Задание 12
У меня есть текущая таблица со столбцами id, line и cost. Я хочу получить желаемую таблицу, как показано на рисунке ниже. Чтобы было понятно, я хочу удалить последовательные повторяющиеся записи в таблице. В приведённой ниже таблице я хочу рассчитать общую стоимость без последовательного дублирования.
Например, строка 3 должна быть удалена, поскольку она последовательно дублируется строкой 2, ведь данные всех 3 столбцов одинаковы. То же самое относится и ко второй группе, строка 7 должна быть удалена, поскольку она дублирует строку 6. Общая стоимость в конце должна составить 10 долларов.
Вот тестовый код:
Решение
Ниже представлено решение:
Задание 13
У меня есть таблица под названием Location. Данные выглядят так, как показано на рисунке ниже. Я хочу разделить элемент данных на основе разделителя:
Вот тестовый код:
Решение
Статья была взята отсюда: