{"id":28316220,"url":"https://github.com/tiaki026/sql-test","last_synced_at":"2026-01-27T23:09:40.948Z","repository":{"id":290990308,"uuid":"976219698","full_name":"Tiaki026/SQL-test","owner":"Tiaki026","description":"Просто задачки по SQL","archived":false,"fork":false,"pushed_at":"2025-05-01T18:12:48.000Z","size":10,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-25T02:11:31.653Z","etag":null,"topics":["oracle","sql"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Tiaki026.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-01T18:02:47.000Z","updated_at":"2025-05-01T18:16:25.000Z","dependencies_parsed_at":"2025-05-01T19:36:16.847Z","dependency_job_id":null,"html_url":"https://github.com/Tiaki026/SQL-test","commit_stats":null,"previous_names":["tiaki026/sql-test"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tiaki026%2FSQL-test","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tiaki026%2FSQL-test/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tiaki026%2FSQL-test/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tiaki026%2FSQL-test/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Tiaki026","download_url":"https://codeload.github.com/Tiaki026/SQL-test/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tiaki026%2FSQL-test/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":257371209,"owners_count":22536164,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["oracle","sql"],"created_at":"2025-05-25T02:11:10.351Z","updated_at":"2026-01-27T23:09:35.922Z","avatar_url":"https://github.com/Tiaki026.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# SQL-test\n\n### Задачи по SQL\n\nОставлю на память 🤸\n\n---\n\n★ Задача №1\n\nНаписать запрос, выводящий имя и фамилию самых бедных клиентов -\nсреди замужних женщин, не проживающих ни в Японии, ни в Бразилии,\nни в Италии. Богатство определяется по кредитному лимиту.\n[Отсортировать по CUST_LAST_NAME].\n\n```sql\nSELECT\n\tc.CUST_FIRST_NAME,\n\tc.CUST_LAST_NAME\nFROM\n\tsh.CUSTOMERS c\nWHERE\n\tCUST_GENDER = 'F'\n\tAND CUST_MARITAL_STATUS = 'Married'\n\tAND COUNTRY NOT IN ('Japan', 'Brazil', 'Italy')\n\tAND c.CUST_CREDIT_LIMIT = (\n\t\tSELECT MIN(CUST_CREDIT_LIMIT)\n\t\tFROM sh.CUSTOMERS\n\t)\nORDER BY c.CUST_LAST_NAME;\n```\n\n---\n\n★ Задача №2\n\nНаписать запрос, выводящий клиента с самым длинным домашним адресом,\nчей телефонный номер заканчивается на 77. Вывести результат в одном столбце,\nв формате “Name: [cust_first_name] [cust_last_name]; city: [cust_city];\naddress: [cust_street_address]; number:[cust_main_phone_number];\nemail: [cust_email]; ”. (всё, что обернуто в [] – названия полей (столбцов) таблицы).\n*/\n\n```sql\nSELECT\n\t'Name: ' || CUST_FIRST_NAME  || ' ' || CUST_LAST_NAME  || '; ' ||\n\t'city: ' || CUST_CITY  || '; ' ||\n\t'address: ' || CUST_STREET_ADDRESS  || '; ' ||\n\t'number: ' || CUST_MAIN_PHONE_NUMBER  || '; ' ||\n\t'email: ' || CUST_EMAIL  || ';'  AS LONG_ADRESS\nFROM\n\tsh.CUSTOMERS\nWHERE\n\tCUST_MAIN_PHONE_NUMBER LIKE '%77'\n\tAND LENGTH(CUST_STREET_ADDRESS) = (\n\t\tSELECT MAX(LENGTH(CUST_STREET_ADDRESS))\n\t\tFROM sh.CUSTOMERS\n\t\tWHERE CUST_MAIN_PHONE_NUMBER LIKE '%77'\n\t);\n```\n\n---\n\n★ Задача №3\n\nНаписать запрос, выводящий всех клиентов, которые купили самый\nдешевый продукт (цена считается от цены продажи - cust_list_price)\nв субкатегории 'Sweaters - Men' или 'Sweaters - Women'\n(связка таблиц CUSTOMERS -\u003e SALES -\u003e PRODUCTS), среди тех, кто родился\nпозже 1980 года, вывод должен быть отсортирован по cust_id.\n\n```sql\nSELECT DISTINCT\n\tc.CUST_ID,\n\tc.CUST_FIRST_NAME,\n\tc.CUST_LAST_NAME\nFROM\n\tsh.CUSTOMERS c\nJOIN sh.SALES s ON c.CUST_ID = s.CUST_ID\nJOIN sh.PRODUCTS p ON s.PROD_ID = p.PROD_ID\nWHERE\n\tp.PROD_SUBCATEGORY IN ('Sweaters - Men', 'Sweaters - Women')\n\tAND c.CUST_YEAR_OF_BIRTH \u003e 1980\n\tAND p.PROD_LIST_PRICE = (\n\t\tSELECT MIN(p.PROD_LIST_PRICE)\n\t\tFROM sh.SALES s\n\t\tJOIN sh.PRODUCTS p ON s.PROD_ID = p.PROD_ID\n\t\tWHERE p.PROD_SUBCATEGORY IN ('Sweaters - Men', 'Sweaters - Women')\n\t)\nORDER BY c.CUST_ID;\n```\n\n---\n\n★ Задача №4\n\nНаписать запрос, выводящий всех клиентов-мужчин с уровнем дохода \"D\",\nу которых не заполнено поле \"семейное положение\" и которые проживают\nв США или Германии (с использованием EXISTS). Отсортировать по cust_id.\n\n```sql\nSELECT\n\tc.CUST_ID,\n\tc.CUST_FIRST_NAME,\n\tc.CUST_LAST_NAME\nFROM\n\tsh.CUSTOMERS c\nWHERE\n\tc.CUST_GENDER = 'M'\n\tAND c.CUST_INCOME_LEVEL LIKE 'D%'\n\tAND c.CUST_MARITAL_STATUS IS NULL\n\tAND EXISTS (\n\t\tSELECT 1\n\t\tFROM sh.COUNTRIES co\n\t\tWHERE co.COUNTRY_ID = c.COUNTRY_ID\n\t\tAND co.COUNTRY_NAME IN ('United States of America', 'Germany')\n\t)\nORDER BY c.CUST_ID;\n```\n\n---\n\n★ Задача №5\n\nНаписать запрос, выводящий среднюю сумму покупки (сумма покупки\nявляется произведением цены товара (prod_list_price) на количество\nпроданного товара (quantity_sold)) в каждой стране, полное название\nстраны. Отсортировать в порядке убывания средней суммы.\n\n```sql\nSELECT\n\tco.COUNTRY_NAME AS \"Страна\",\n\tAVG(p.PROD_LIST_PRICE * s.QUANTITY_SOLD) AS \"Средняя сумма\"\nFROM\n\tsh.SALES s\nJOIN sh.CUSTOMERS c ON s.CUST_ID = c.CUST_ID\nJOIN sh.COUNTRIES co ON c.COUNTRY_ID = co.COUNTRY_ID\nJOIN sh.PRODUCTS p ON s.PROD_ID = p.PROD_ID\nGROUP BY\n\tco.COUNTRY_NAME\nORDER BY \"Средняя сумма\" DESC;\n```\n---\n\n★ Задача №6\n\nНаписать запрос, выводящий \"популярность\" почтовых доменов \nклиентов, т.е. количество клиентов с почтой в каждом из доменов.\n\n```sql\nSELECT\n\tSUBSTR(c.CUST_EMAIL, INSTR(c.CUST_EMAIL, '@') + 1) AS \"Домен\",\n\tCOUNT(*) AS \"Количество\"\nFROM\n\tsh.CUSTOMERS c\nWHERE\n\tc.CUST_EMAIL IS NOT NULL\nGROUP BY\n\tSUBSTR(c.CUST_EMAIL, INSTR(c.CUST_EMAIL, '@') + 1)\nORDER BY \"Количество\" DESC;\n```\n\n---\n\n★ Задача №7\n\nНаписать запрос, выводящий распределение суммы проданных товаров\nв единицах (quantity_sold) категории \"Men\" по странам (т.е.\nраспределение по странам, в которых проживают клиенты), в конечной\nвыборке оставить те страны, в которых общее количество проданных\nтоваров в единицах выше, чем средняя сумма проданных товаров в\nединицах этой категории в стране (по всему миру). Упорядочить по\nполному названию стран.\n\n```sql\nWITH country_sums AS (\n\tSELECT\n\t\tco.COUNTRY_NAME,\n\t\tSUM(s.QUANTITY_SOLD) AS total\n\tFROM\n\t\tsh.SALES s\n\t\tJOIN sh.CUSTOMERS c ON s.CUST_ID = c.CUST_ID\n\t\tJOIN sh.COUNTRIES co ON c.COUNTRY_ID = co.COUNTRY_ID\n\t\tJOIN sh.PRODUCTS p ON s.PROD_ID = p.PROD_ID\n\tWHERE\n\t\tp.PROD_CATEGORY = 'Men'\n\tGROUP BY co.COUNTRY_NAME\n)\nSELECT\n\tCOUNTRY_NAME AS \"Страна\",\n\ttotal AS \"Количество товаров\"\nFROM\n\tcountry_sums\nWHERE\n\ttotal \u003e (SELECT AVG(total) FROM country_sums)\nORDER BY \"Страна\";\n```\n\n---\n\n★ Задача №8\n\nНаписать запрос, выводящий процентное соотношение мужчин и женщин,\nпроживающих в каждой стране, отсортированное по названию страны в\nалфавитном порядке. Столбцы в выводе должны быть такими: «Страна»,\n«% мужчин», «% женщин» [использовать WITH]. Упорядочить по полному\nназванию стран.\n\n```sql\nWITH customer_stats AS (\n\tSELECT\n\t\tco.COUNTRY_NAME,\n\t\tCOUNT(\n\t\t\tCASE WHEN c.CUST_GENDER = 'M' THEN 1 END\n\t\t) AS male_count,\n\t\tCOUNT(\n\t\t\tCASE WHEN c.CUST_GENDER = 'F' THEN 1 END\n\t\t) AS female_count,\n\t\tCOUNT(*) AS total\n\tFROM\n\t\tsh.CUSTOMERS c\n\tJOIN\n\t\tsh.COUNTRIES co ON c.COUNTRY_ID = co.COUNTRY_ID\n\tGROUP BY\n\t\tco.COUNTRY_NAME\n)\nSELECT\n\tCOUNTRY_NAME AS \"Страна\",\n\tROUND(male_count * 100.0 / total, 2) AS \"% мужчин\",\n\tROUND(female_count * 100.0 / total, 2) AS \"% женщин\"\nFROM\n\tcustomer_stats\nORDER BY \"Страна\";\n```\n\n---\n\n★ Задача №9\n\nНаписать запрос, выводящий максимальное суммарное количество\nпроданных единиц товара (quantity_sold) за день для каждого\nпродукта (т.е. продукты в выводе не должны повторяться).\nЗапрос должен выводить TOP 20 строк, отсортированных по убыванию\nколичества проданных единиц товара (Столбцы должны быть такими:\n\"Макс покуп/день\", prod_name) [Под первым столбцом подразумевается\nобъединение в одно поле количества покупок и последней даты,\nза которую сделаны эти покупки].\n\n```sql\nWITH product_daily_totals AS (\n\tSELECT\n\t\tp.PROD_NAME,\n\t\tt.TIME_ID,\n\t\tSUM(s.QUANTITY_SOLD) AS daily_total\n\tFROM\n\t\tsh.SALES s\n\t\tJOIN sh.PRODUCTS p ON s.PROD_ID = p.PROD_ID\n\t\tJOIN sh.TIMES t ON s.TIME_ID = t.TIME_ID\n\tGROUP BY\n\t\tp.PROD_NAME, t.TIME_ID\n)\nSELECT\n\tMAX(daily_total) || ' (' || \n\tTO_CHAR(\n\t\tMAX(TIME_ID) KEEP (\n\t\t\tDENSE_RANK FIRST ORDER BY daily_total DESC\n\t\t),\n\t\t'DD.MM.YYYY'\n\t) || ')' AS \"Макс покуп/день\",\n\tPROD_NAME AS \"prod_name\"\nFROM\n\tproduct_daily_totals\nGROUP BY PROD_NAME\nORDER BY MAX(daily_total) DESC\nFETCH FIRST 20 ROWS ONLY;\n```\n\n---\n\n★ Задача №10\n\nНаписать запрос, выводящий максимальное суммарное количество проданных единиц товара за день\nдля каждой категории продуктов. Отсортировать по убыванию количества.\n(Столбцы должны быть такими: \"Макс за день\", prod_category).\n[Под первым столбцом подразумевается одно число].\n\n```sql\nWITH daily_sales AS (\n\tSELECT\n\t\tp.PROD_CATEGORY,\n\t\tt.TIME_ID,\n\t\tSUM(s.QUANTITY_SOLD) AS daily_quantity\n\tFROM\n\t\tsh.SALES s\n\t\tJOIN sh.PRODUCTS p ON s.PROD_ID = p.PROD_ID\n\t\tJOIN sh.TIMES t ON s.TIME_ID = t.TIME_ID\n    GROUP BY\n        p.PROD_CATEGORY, t.TIME_ID\n)\nSELECT\n\tMAX(daily_quantity) AS \"Макс за день\",\n\tPROD_CATEGORY AS \"prod_category\"\nFROM\n\tdaily_sales\nGROUP BY PROD_CATEGORY\nORDER BY \"Макс за день\" DESC;\n```\n\n---\n\n★ Задача №11\n\nНаписать запрос, который создаст таблицу с именем\nsales_[имя пользователя в ОС]_[Ваше имя]_[Ваша фамилия],\nсодержащую строки из таблицы sh.sales за один пиковый месяц.\n(Т.е. месяц, за который получена максимальная выручка).\nПоказать все поля таблицы в порядке возрастания дат.\n\n```sql\nCREATE TABLE sales_tiaki_Eugene_Kolotikov AS\nWITH peak_month AS (\n\tSELECT t2.CALENDAR_MONTH_DESC\n\tFROM sh.SALES s2\n\tJOIN sh.TIMES t2 ON s2.TIME_ID = t2.TIME_ID\n\tGROUP BY t2.CALENDAR_MONTH_DESC\n\tORDER BY SUM(s2.AMOUNT_SOLD) DESC\n\tFETCH FIRST 1 ROW ONLY\n)\nSELECT s.*\nFROM sh.SALES s\nWHERE s.TIME_ID IN (\n\tSELECT t.TIME_ID\n\tFROM sh.TIMES t\n\tWHERE t.CALENDAR_MONTH_DESC = (SELECT CALENDAR_MONTH_DESC FROM peak_month)\n)\nORDER BY s.TIME_ID ASC;\n```\n\n---\n\n★ Задача №12\nНаписать запрос, который для созданной в задании 11 таблицы изменит \nзначение поля time_id на формат 'DD.MM.YYYY HH24:MI:SS' (см. NLS_DATE_FORMAT).\nЗначение hh24:mm:ss должно выбираться случайным образом. Сохранить сделанные \nизменения. Показать все поля таблицы в порядке возрастания дат.\nSELECT dbms_random.value FROM DUAL возвращает случайное значение от 0 до 1;\n\n```sql\nUPDATE sales_tiaki_Eugene_Kolotikov\nSET time_id = TRUNC(time_id) + DBMS_RANDOM.VALUE(0, 1);\n\nCOMMIT;\n\nSELECT\n\tprod_id,\n\tcust_id,\n\tTO_CHAR(time_id, 'DD.MM.YYYY HH24:MI:SS') AS time_id,\n\tchannel_id,\n\tpromo_id,\n\tquantity_sold,\n\tamount_sold\nFROM\n\tsales_tiaki_Eugene_Kolotikov\nORDER BY time_id;\n```\n\n---\n\n★ Задача №13\n\nНаписать запрос, выводящий почасовую разбивку количества операций продажи для Вашей таблицы.\n\n```sql\nSELECT\n\tTO_CHAR(time_id, 'HH24') AS \"Час\",\n\tCOUNT(*) AS \"Количество продаж\"\nFROM\n\tsales_tiaki_Eugene_Kolotikov\nGROUP BY TO_CHAR(time_id, 'HH24')\nORDER BY TO_CHAR(time_id, 'HH24');\n```\n\n---\n\n★ Задача №14\n\nНаписать запрос, который удалит созданную в задании 11 таблицу. Сохранить сделанные изменения.\n\n```sql\nDROP TABLE sales_tiaki_Eugene_Kolotikov PURGE;\n\nCOMMIT;\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftiaki026%2Fsql-test","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftiaki026%2Fsql-test","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftiaki026%2Fsql-test/lists"}