Advertisement
Kelevra_Slevin

Sprint SQL

Apr 26th, 2023 (edited)
12,605
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 49.78 KB | None | 0 0
  1. --THEME 2/7 Lession 5-10
  2.  
  3. SELECT total,
  4.        customer_id
  5.        
  6. FROM invoice
  7.  
  8. WHERE (billing_city = 'Dublin'
  9.     OR billing_city = 'London'
  10.     OR billing_city = 'Paris')
  11.     AND total >= 5
  12.     AND (customer_id = 40
  13.     OR customer_id = 46);
  14.  
  15. SELECT billing_city,
  16.        billing_address
  17. FROM invoice
  18. WHERE CAST (invoice_date AS DATE) <= '2009-09-30'
  19.     AND CAST (invoice_date AS DATE) >= '2009-09-01'
  20.    
  21.     AND billing_country != 'Brazil'
  22.     AND billing_country != 'USA'
  23.     AND total > 2;
  24.  
  25. SELECT name
  26. FROM playlist
  27. WHERE name LIKE '%Classic%';
  28.  
  29.  
  30. SELECT billing_address,
  31.        billing_country
  32. FROM invoice
  33. WHERE billing_country IN ('USA',
  34.                           'India',
  35.                           'Canada',
  36.                           'Argentina',
  37.                           'France')
  38. AND billing_city != 'Redmond'
  39. AND billing_city != 'Lyon'
  40. AND billing_city != 'Delhi';-- сюда добавьте условие;
  41.  
  42. --5.
  43. --Выгрузите из таблицы movie название фильмов, описание которых заканчивается подстрокой Mexico. Аренда фильмов из итоговой таблицы должна составлять меньше двух долларов либо их рейтинг не должен быть PG-13.
  44.  
  45. SELECT title
  46. FROM movie
  47. WHERE description LIKE '%Mexico%'
  48.     AND (rental_rate < 2
  49.     OR rating != 'PG-13');
  50.  
  51.  
  52. --6.
  53. --Из таблицы с треками отберите названия композиций, которые соответствуют условиям. В итоговую таблицу должны войти:
  54. треки длиннее 300000 миллисекунд, в создании которых принимал участие Bono, с идентификаторами жанра 7, 8, 9, 10;
  55. либо треки, размер которых превышает 1000000000 байт.
  56.  
  57. SELECT name
  58. FROM track
  59. WHERE composer LIKE '%Bono%'
  60.     AND milliseconds > '300000'
  61.     AND genre_id >= 7
  62.     AND genre_id <= 10
  63.     OR bytes > 1000000000;
  64.  
  65.  
  66. --THEME 2/7 Lession 11
  67. --1.
  68. --Добавьте условие в код задания: выгрузите из таблицы invoice несколько полей, в которых указаны идентификаторы покупателей от 20 до 50 включительно.
  69.  
  70. SELECT customer_id,
  71.        invoice_date,
  72.        total
  73. FROM invoice
  74. WHERE customer_id BETWEEN 20 AND 50;-- сюда запишите условие;
  75.  
  76. --2.
  77. --Добавьте к выгруженным полям информацию о месяце и неделе заказа. Информацию о дате хранит поле invoice_date. Месяц заказа должен быть представлен первым числом месяца в формате '2009-01-01 00:00:00', а неделя заказа — номером недели.
  78. --Не забудьте изменить тип данных поля invoice_date, чтобы применить функции для работы с датой.  Поменяйте тип данных поля на timestamp. Тогда данные не исказятся от автоматической поправки на часовой пояс.
  79.  
  80. SELECT customer_id,
  81.        invoice_date,
  82.        total,
  83. DATE_TRUNC ('month',
  84. CAST (invoice_date AS TIMESTAMP)),
  85.     EXTRACT (WEEK FROM CAST (invoice_date AS TIMESTAMP))
  86. FROM invoice
  87. WHERE customer_id BETWEEN 20 AND 50;
  88.  
  89. --3.
  90. --Отфильтруйте получившуюся таблицу по номерам недели. Оставьте в таблице данные за 5, 7, 10, 33 и 48 недели. Добавьте второе условие после оператора WHERE: укажите EXTRACT(WEEK FROM CAST(invoice_date AS timestamp)), чтобы выделить номер недели, и выберите нужные номера с помощью оператора IN.
  91.  
  92. SELECT customer_id,
  93.        invoice_date,
  94.        total,
  95.        DATE_TRUNC('month', CAST(invoice_date AS TIMESTAMP)),
  96.        EXTRACT(WEEK FROM CAST(invoice_date AS TIMESTAMP))
  97. FROM invoice
  98. WHERE customer_id BETWEEN 20 AND 50
  99. AND EXTRACT(WEEK FROM CAST(invoice_date AS TIMESTAMP)) IN (5,
  100.                                                        7,
  101.                                                        10,
  102.                                                        33,
  103.                                                        48);
  104.  
  105. --4.
  106. --Выгрузите из таблицы invoice всю информацию о заказах, оформленных первого числа каждого месяца. Не забудьте привести дату к типу timestamp.
  107. --Подсказка. Получить из даты первое число месяца можно двумя способами. Первый — можно усечь дату до нужного значения функцией DATE_TRUNC. Второй вариант — выделить номер дня функцией EXTRACT.
  108.  
  109. SELECT *
  110. FROM invoice
  111. WHERE EXTRACT(DAY FROM CAST(invoice_date AS TIMESTAMP)) = 1
  112.  
  113. --5.
  114. --Выгрузите адреса электронной почты сотрудников из города Калгари (англ. Calgary), которых наняли на работу в 2002 году. Попробуйте выполнить это задание без подсказок.
  115.  
  116. SELECT email
  117. FROM staff
  118. WHERE city = 'Calgary'
  119. AND EXTRACT(YEAR FROM CAST(hire_date AS TIMESTAMP)) = 2002;
  120.  
  121. ----THEME 2/7 Lession 11
  122.  
  123. SELECT total,
  124.        CASE
  125.            WHEN total < 5 THEN 'маленький'
  126.            WHEN total >= 5 AND total < 10 THEN 'средний'
  127.            WHEN total >= 10 THEN 'крупный'
  128.        END
  129. FROM invoice
  130. LIMIT 10;
  131.  
  132. SELECT total,
  133.        CASE
  134.            WHEN total >= 5 AND total < 10 THEN 'средний'
  135.            WHEN total >= 10 THEN 'крупный'
  136.            ELSE 'маленький'
  137.        END
  138. FROM invoice
  139. LIMIT 10;
  140.  
  141. --1.
  142. --Выделите категории в таблице staff, которая хранит информацию о сотрудниках. Выведите на экран поля last_name, first_name и title. Категории нужно выделить на основе значений в поле title — оно содержит информацию о должности сотрудника:
  143. --Если в title встречается слово 'IT', в новом поле будет отображена категория 'разработка'.
  144. --Если в title встречается слово 'Manager' и нет слова 'IT', в новом поле отобразится категория 'отдел продаж'.
  145. --Если в title встречается слово 'Support', в новом поле появится категория 'поддержка'.
  146.  
  147. SELECT last_name,
  148.        first_name,
  149.        title,-- здесь укажите нужные поля
  150.       CASE
  151.           WHEN title LIKE '%IT%' THEN 'разработка'
  152.           WHEN title LIKE '%Manager%' THEN 'отдел продаж'
  153.           WHEN title LIKE '%Support%' THEN 'поддержка'
  154.       END -- сюда запишите условия
  155. FROM staff;
  156.  
  157. --2.
  158. --Теперь попробуйте разделить на категории фильмы из таблицы movie. Выведите на экран поля title и rental_rate. Выделить категории нужно по цене аренды фильма:
  159. --Если значение rental_rate меньше 1, в новом поле появится категория 'категория 1'.
  160. --Если значение rental_rate больше либо равно 1, но меньше 3, в новом поле отобразится категория 'категория 2'.
  161. --Если значение rental_rate больше либо равно 3, в новом поле появится категория 'категория 3'.
  162.  
  163. SELECT title,
  164.        rental_rate,-- сюда добавьте поля
  165.        CASE
  166.            WHEN rental_rate < 1 THEN 'категория 1'
  167.            WHEN rental_rate >= 1 AND rental_rate < 3 THEN 'категория 2'
  168.            WHEN rental_rate > 3 THEN 'категория 3'
  169.            END-- здесь запишите условия
  170. FROM movie;
  171.  
  172. --THEME 2/7 Lession 13
  173.  
  174. --1.
  175. --Из таблицы invoice выгрузите поле billing_city с городами оформления счёта. Выгрузите только те записи, в которых на месте индекса стоит пропуск. Данные с индексами хранит поле billing_postal_code.
  176.  
  177. SELECT billing_city
  178. FROM invoice
  179. WHERE billing_postal_code IS NULL;-- сюда запишите условие;
  180.  
  181. --2.
  182. --Дополните предыдущий запрос. Исключите из выдачи записи с пропусками в поле billing_state. Выберите записи, в которых сумма заказа в поле total не ниже 15 долларов.
  183.  
  184. SELECT billing_city
  185. FROM invoice
  186. WHERE billing_postal_code IS NULL
  187.   AND billing_state IS NOT NULL
  188.   AND total > 15;-- дополните условие;
  189.  
  190. --3.
  191. --Найдите треки длиннее 250000 миллисекунд, в названии которых есть слово Moon, но автор трека не указан. Выгрузите номера альбомов, в которых находятся выбранные треки.
  192.  
  193. SELECT album_id
  194. FROM track
  195. WHERE name LIKE '%Moon%'
  196. AND (composer IS NULL
  197. AND milliseconds > 250000);
  198.  
  199. --4.
  200. --Отобразите имена, фамилии и страну проживания для покупателей, которые не указали информацию о месте работы, регионе проживания, а также телефон и факс.
  201.  
  202. SELECT first_name,
  203.        last_name,
  204.        country
  205. FROM client
  206. WHERE company IS NULL
  207. AND state IS NULL
  208. AND phone IS NULL
  209. AND fax IS NULL;
  210.  
  211. -- THEME 3/7
  212.  
  213. --Функция    Описание    Пример    Результат
  214. --ABS   Возвращает модуль числа    ABS(-14)    14
  215. --CEILING   Возвращает число, округлённое до целого в большую сторону  CEILING(42.8)   43
  216. --FLOOR Возвращает число, округлённое до целого в меньшую сторону  FLOOR(42.8) 42
  217. --ROUND Округляет значение до ближайшего числа, округляет число до определённого количества знаков после запятой ROUND(42.4)
  218. --ROUND(42.4382, 2) 42 42.44
  219. --TRUNC Усекает значение до ближайшего числа, усекает число до указанного количества знаков после запятой, но число при этом не округляет  TRUNC(42.4) TRUNC(42.4382, 2)   42 42.43
  220. -- POWER    Возвращает число, возведённое в степень, — нужную степень указывают вторым аргументом POWER(9, 3) 729
  221. --SQRT  Извлекает квадратный корень из числа    SQRT(9) 3
  222.  
  223.  
  224. --THEME 3/7 Lession 3
  225.  
  226. --1.
  227. --Перед тем как применить агрегирующие функции, нужно получить срез данных. Выгрузите все поля из таблицы invoice, выберите записи о заказах, оформленных в сентябре. Информацию о дате заказа содержит поле invoice_date. Тип данных поля — varchar. Не забудьте про функции для работы с датой.
  228.  
  229. SELECT *
  230. FROM invoice
  231. WHERE EXTRACT(MONTH FROM CAST(invoice_date AS TIMESTAMP)) = 9;
  232.  
  233. --2.
  234. --Дополните запрос. Оставьте в таблице поля с идентификатором покупателя (поле customer_id), датой заказа без времени (поле invoice_date) и суммой заказа (поле total). Выберите покупателей с идентификаторами 11, 13, 44, 36, 48, 52, 54, 56.
  235.  
  236. SELECT customer_id,
  237.        CAST (invoice_date AS DATE),
  238.        total
  239. FROM invoice
  240. WHERE EXTRACT(MONTH FROM CAST(invoice_date AS TIMESTAMP)) = 9
  241. AND customer_id IN (11, 13, 44, 36, 48, 52, 54, 56);
  242.  
  243. --3.
  244. --Дополните запрос. Найдите минимальное и максимальное значения поля total. Условия для среза остаются прежними.
  245.  
  246. SELECT MIN(total),
  247.        MAX(total)-- добавьте расчёты с помощью агрегирующих функций
  248. FROM invoice
  249. WHERE EXTRACT(MONTH FROM CAST(invoice_date AS TIMESTAMP)) = 9
  250.   AND customer_id IN (11, 13, 44, 36, 48, 52, 54, 56);
  251.  
  252. --4.
  253. --Добавьте к минимуму и максимуму несколько новых полей:
  254. --среднее значение поля total, округлённое до ближайшего числа;
  255. --количество уникальных идентификаторов покупателей из поля customer_id;
  256. --суммарная выручка.
  257. --Не меняйте условия для среза данных.
  258.  
  259. SELECT MIN(total),
  260.        MAX(total),
  261.        ROUND(AVG(total)),
  262.        COUNT(DISTINCT customer_id),
  263.        SUM(total)-- добавьте нужные поля
  264. FROM invoice
  265. WHERE EXTRACT(MONTH FROM CAST(invoice_date AS TIMESTAMP)) = 9
  266.   AND customer_id IN (11, 13, 44, 36, 48, 52, 54, 56);
  267.  
  268. --5.
  269. --Посчитайте, сколько пропусков содержит поле fax из таблицы client.
  270.  
  271. SELECT COUNT(*)-COUNT(fax)
  272. FROM client;
  273.  
  274.  
  275. --6.
  276. --Посчитайте среднюю стоимость заказов, оформленных в понедельник.
  277.  
  278. SELECT AVG(total)
  279. FROM invoice
  280. WHERE CAST(invoice_date AS TIMESTAMP) = DATE_TRUNC('week', CAST(invoice_date AS TIMESTAMP));
  281.  
  282. --THEME 3/7 Lession 4
  283.  
  284. -- нужно указать поля и необходимые вычисления
  285. SELECT billing_city,
  286.        ROUND(AVG(total))
  287. FROM invoice -- не забыть таблицу
  288. GROUP BY billing_city -- здесь указывают поле, по которому группируют данные
  289. LIMIT 5;
  290.  
  291. --1.
  292. --Группировка помогает сравнивать данные. Но сначала нужно получить срез. Напишите запрос, который выгрузит общую выручку (поле total) в США (англ. USA). Информацию о стране хранит поле billing_country.
  293.  
  294. SELECT SUM(total)-- добавьте агрегирующую функцию
  295. FROM invoice
  296. WHERE billing_country = 'USA'-- сюда напишите условие;
  297.  
  298. --2.
  299. --Теперь можно проверить, как отличаются данные по городам. Посчитайте общую выручку, количество заказов, среднюю выручку для каждого города США. Нужное поле — billing_city.
  300.  
  301. SELECT billing_city,
  302.        SUM(total),
  303.        COUNT(invoice_id),
  304.        AVG(total)
  305.        -- добавьте агрегирующие функции
  306. FROM invoice
  307. WHERE billing_country = 'USA'
  308. GROUP BY billing_city-- впишите категорию для группировки;
  309.  
  310.  
  311. --3.
  312. --Проверьте, какую выручку в среднем приносит каждый покупатель. Выгрузите общую сумму выручки, число уникальных покупателей (поле customer_id) и среднюю выручку на  уникального пользователя для страны США.
  313.  
  314. SELECT SUM(total),
  315.        SUM(total)/COUNT(DISTINCT customer_id),
  316.        COUNT(DISTINCT customer_id)-- добавьте агрегирующую функцию
  317. FROM invoice
  318. WHERE billing_country = 'USA';
  319.  
  320. --4.
  321. --Дополните предыдущий запрос. Сгруппируйте данные по неделе заказа. Для этого нужно усечь дату из поля invoice_date, округлив её до первого дня недели. Обратите внимание, поле invoice_date хранит данные типа varchar.
  322.  
  323. SELECT DATE_TRUNC('week', CAST(invoice_date AS TIMESTAMP)),-- впишите поле с категориями
  324.        SUM(total),
  325.        COUNT(DISTINCT customer_id),
  326.        SUM(total)/COUNT(DISTINCT customer_id)
  327. FROM invoice
  328. WHERE billing_country = 'USA'
  329. GROUP BY DATE_TRUNC('week',CAST(invoice_date AS TIMESTAMP))-- сгруппируйте данные;
  330.  
  331. --5.
  332. --Посчитайте, сколько пользователей с почтовыми доменами yahoo и gmail обслужил каждый сотрудник. В итоговой таблице должны быть два поля:
  333. --идентификатор сотрудника,
  334. --количество пользователей.
  335.  
  336. SELECT support_rep_id,
  337.        COUNT(customer_id)
  338.  
  339. FROM client
  340. WHERE email LIKE '%yahoo%'
  341.     OR email LIKE '%gmail%'
  342.    
  343. GROUP BY support_rep_id
  344.        
  345.  
  346. --6.
  347. --Создайте новое поле с категориями:
  348. --заказы на сумму меньше одного доллара получат категорию 'low cost';
  349. --заказы на сумму от одного доллара и выше получат категорию 'high cost'.
  350. --Для каждой категории посчитайте сумму значений в поле total, но только для тех заказов, при оформлении которых указан почтовый код. В итоговую таблицу должны войти только два поля.
  351.  
  352. SELECT CASE
  353.        WHEN total < 1 THEN ('low cost')
  354.        WHEN total >=1 THEN ('high cost')
  355.        END,
  356. SUM (total)
  357. FROM invoice
  358. WHERE billing_postal_code IS NOT NULL
  359. GROUP BY
  360.        CASE
  361.        WHEN total < 1 THEN ('low cost')
  362.        WHEN total >=1 THEN ('high cost')
  363.        END
  364.        
  365. --THEME 3/7 Lession 6
  366. --1.
  367. --Отберите пять самых крупных заказов из таблицы invoice.
  368.  
  369. SELECT *
  370. FROM invoice
  371. ORDER BY total DESC-- впишите условие для сортировки
  372. LIMIT 5 -- добавьте ограничение;
  373.  
  374. --2.
  375. --Отберите пятерых самых активных клиентов в США с 25 мая 2011 по 25 сентября 2011. Дату хранит поле invoice_date, тип данных поля — varchar. Выведите два поля: идентификатор клиента и количество заказов. Расположите записи по убыванию количества заказов. Идентификаторы с одинаковым числом заказов должны быть отсортированы по возрастанию.
  376.  
  377. SELECT customer_id,
  378.        COUNT(customer_id)
  379. FROM invoice
  380. WHERE billing_country = 'USA'
  381. AND CAST(invoice_date AS DATE) BETWEEN '2011.05.25' AND '2011.09.25'-- сюда впишите условия
  382. GROUP BY customer_id
  383. ORDER BY COUNT(customer_id) DESC, customer_id
  384. -- добавьте данные для сортировки
  385. LIMIT 5;
  386.  
  387. --3.
  388. --Нужно посмотреть продажи по годам. Выгрузите таблицу, в которую войдут:
  389. --год покупки;
  390. --минимальная сумма заказа;
  391. --максимальная сумма заказа;
  392. --общая сумма выручки;
  393. --количество заказов;
  394. --средняя выручка на уникального покупателя, округлённая до ближайшего целого числа.
  395. --Отсортируйте таблицу по году от большего к меньшему. Отберите только те записи, в которых в поле billing_country указаны страны: США (англ. USA), Великобритания (англ. United Kingdom) и Германия (англ. Germany).
  396.  
  397. SELECT EXTRACT(YEAR FROM CAST(invoice_date AS TIMESTAMP)),
  398.        MIN(total),
  399.        MAX(total),
  400.        SUM(total),
  401.        COUNT(total),
  402.        ROUND(SUM(total)/COUNT(DISTINCT customer_id))
  403.        
  404. FROM invoice
  405. WHERE billing_country IN ('USA',
  406.                          'United Kingdom',
  407.                          'Germany')
  408. GROUP BY EXTRACT(YEAR FROM CAST(invoice_date AS TIMESTAMP))
  409. ORDER BY EXTRACT(YEAR FROM CAST(invoice_date AS TIMESTAMP)) DESC-- Попробуйте выполнить запрос самостоятельно, без подсказок
  410.  
  411. --THEME 3/7 Lession 9
  412.  
  413. SELECT rating,
  414.        AVG(rental_rate)-- укажите нужные поля
  415. FROM movie
  416. GROUP BY rating-- сгруппируйте данные
  417. HAVING AVG(rental_rate) > 3;-- пропишите условие;
  418.  
  419. --2.
  420. --Изучите заказы, которые оформили в сентябре 2011 года. Сравните общую сумму выручки (поле total) за каждый день этого месяца: выведите день в формате '2011-09-01'  и сумму. Информацию о дате заказа хранит поле invoice_date. Не забудьте изменить тип данных в этом поле, чтобы использовать операторы для работы с датой. Оставьте в таблице только те значения суммы, которые больше 1 и меньше 10.
  421.  
  422. SELECT CAST(invoice_date AS DATE),
  423.        SUM(total)-- укажите нужные поля
  424. FROM invoice
  425. WHERE CAST(invoice_date AS DATE) BETWEEN '2011-09-01' AND '2011-09-30'-- пропишите условие
  426. GROUP BY CAST(invoice_date AS DATE)-- сгруппируйте данные
  427. HAVING SUM(total) > 1 AND SUM(total) < 10-- добавьте условие;
  428.  
  429. --3.
  430. --Посчитайте пропуски в поле с почтовым индексом billing_postal_code для каждой страны (поле billing_country). Получите срез: в таблицу должны войти только те записи, в которых поле billing_address не содержит слов Street, Way, Road или Drive. Отобразите в таблице страну и число пропусков, если их больше 10.
  431.  
  432. SELECT billing_country,
  433.        COUNT(*)
  434. FROM invoice
  435. WHERE billing_postal_code IS NULL
  436.   AND NOT (billing_address LIKE '%Street%'
  437.    OR billing_address LIKE '%Way%'
  438.    OR billing_address LIKE '%Road%'
  439.    OR billing_address LIKE '%Drive%')
  440. GROUP BY billing_country
  441. HAVING COUNT(*) > 10;
  442.  
  443. ----THEME 3/7 Lession 9
  444.  
  445. SELECT EXTRACT(YEAR FROM CAST(i.invoice_date AS DATE)) AS year_of_purchase,
  446.        MIN(i.total) AS min_cost,
  447.        MAX(i.total) AS max_cost,
  448.        SUM(i.total) AS total_revenue,
  449.        COUNT(i.total) AS total_purchases,
  450.        ROUND(SUM(i.total)/COUNT(DISTINCT(i.customer_id))) AS average_receipt
  451. FROM invoice AS i
  452. WHERE billing_country IN ('USA', 'United Kingdom', 'Germany')
  453. GROUP BY year_of_purchase
  454. ORDER BY year_of_purchase DESC;
  455.  
  456. --2.
  457. --Отберите фильмы, в описании которых встречается слово Epic. Выгрузите таблицу из трёх полей:
  458. --rating_of_epic с рейтингом фильма;
  459. --year_of_epic с годом выхода фильма;
  460. --average_rental со средним сроком аренды.
  461. --Сгруппируйте данные по рейтингу и году выхода фильма.
  462.  
  463. SELECT rating AS rating_of_epic,
  464.        release_year AS year_of_epic,
  465.        AVG(rental_duration) AS average_rental
  466. FROM movie
  467. WHERE description LIKE '%Epic%'
  468. GROUP BY rating_of_epic, year_of_epic
  469.  
  470. --THEME 4/7 Lession 5
  471.  
  472. SELECT c.first_name,
  473.        c.last_name,
  474.        i.total
  475. FROM invoice AS i
  476. INNER JOIN client AS c ON i.customer_id = c.customer_id
  477. LIMIT 10;
  478.  
  479.  
  480. SELECT c.first_name,
  481.        c.last_name,
  482.        MIN(i.total) AS min_cost,
  483.        MAX(i.total) AS max_cost,
  484.        ROUND(AVG(i.total), 2) AS average_cost,
  485.        COUNT(i.total) AS total_purchases
  486. FROM invoice AS i
  487. INNER JOIN client AS c ON i.customer_id = c.customer_id
  488. WHERE i.billing_country = 'USA'
  489. GROUP BY first_name, last_name
  490. ORDER BY average_cost DESC
  491. LIMIT 10;
  492.  
  493. --1.
  494. --Нужно объединить данные двух таблиц: track и invoice_line. Таблица track хранит информацию о музыкальных треках в магазине, названия треков указаны в поле name. Таблица invoice_line содержит данные о купленных треках, их стоимость указана в поле unit_price. В обеих таблицах есть поле track_id — в нём содержатся идентификаторы музыкальных треков.
  495. --Выгрузите таблицу с названием трека и числом, которое соответствует тому, сколько раз трек покупали. Учитывайте, что в одном заказе один и тот же трек может встречаться несколько раз. Если какой-либо из треков не покупали или о купленном треке нет информации — такие записи не должны войти в таблицу. Оставьте в итоговой таблице первые 20 записей.
  496.  
  497. SELECT t.name,
  498.        COUNT(i.quantity)
  499.        
  500. FROM track AS t
  501. INNER JOIN invoice_line AS i ON t.track_id = i.track_id
  502.  
  503. GROUP BY name
  504. LIMIT 20
  505.  
  506. --2.
  507. --Нужно дополнить запрос: добавьте поле с идентификатором плейлиста playlist_id. Такое поле можно получить из таблицы playlist_track. В этой таблице собраны идентификаторы плейлистов и треков (поле track_id). Условие остаётся прежним: если идентификаторы треков не совпадают во всех трёх таблицах, такие треки не должны войти в итоговую таблицу. Выведите первые 20 записей.
  508.  
  509. SELECT t.name,
  510.        SUM(i.quantity),
  511.        p.playlist_id-- укажите необходимое поле
  512. FROM track AS t
  513. INNER JOIN invoice_line AS i ON t.track_id=i.track_id
  514. INNER JOIN playlist_track AS p ON t.track_id=p.track_id
  515. GROUP BY t.name, p.playlist_id -- добавьте новое поле для группировки
  516. LIMIT 20-- добавьте ещё одно присоединение;
  517.  
  518. --3.
  519. --Идентификатор плейлиста теперь указан в итоговой таблице. Но что это за плейлисты — непонятно. Эту информацию можно взять в четвёртой таблице — playlist. Таблица содержит поле playlist_id с идентификатором плейлиста и поле name — с его названием. Добавьте в итоговую таблицу поле name. Условия те же: данные без совпадения не должны попасть в таблицу. Ограничьте вывод первыми 20 записями.
  520.  
  521. SELECT t.name,
  522.        SUM(i.quantity),
  523.        pt.playlist_id,
  524.        pl.name-- укажите необходимое поле
  525. FROM track AS t
  526. INNER JOIN invoice_line AS i ON t.track_id=i.track_id
  527. INNER JOIN playlist_track AS pt ON t.track_id=pt.track_id
  528. INNER JOIN playlist AS pl ON pt.playlist_id=pl.playlist_id
  529. GROUP BY t.name, pt.playlist_id, pl.name -- добавьте новое поле для группировки
  530. LIMIT 20-- добавьте ещё одно присоединение
  531.  
  532. ----THEME 4/7 Lession 6
  533.  
  534. --1.
  535. --Выведите названия всех треков, добавив информацию о датах, в которые эти треки покупали. Ни один трек не должен потеряться, даже если его не покупали вообще. Чтобы получить нужный результат, надо соединить три таблицы сразу, ведь таблица invoice, которая хранит данные о дате заказа, не содержит информации о купленных треках.
  536. --Сначала соедините таблицы track и invoice_line по ключу track_id, а затем присоедините таблицу invoice по ключу invoice_id. В итоговую таблицу поместите два поля: name из таблицы track и invoice_date из таблицы invoice. Приведите дату в нужный формат.
  537.  
  538. SELECT name,
  539.        CAST(invoice_date AS DATE)-- поместите поле с датой
  540. FROM track AS tr-- определите левую таблицу
  541. LEFT OUTER JOIN invoice_line AS il ON il.track_id=tr.track_id
  542. LEFT OUTER JOIN invoice AS i ON i.invoice_id=il.invoice_id-- определите вариант присоединения первой таблицы
  543. -- определите вариант присоединения второй таблицы;
  544.  
  545.  
  546. --2.
  547. --Посчитайте для каждого года число уникальных названий купленных треков.
  548.  
  549. SELECT EXTRACT(YEAR FROM CAST(i.invoice_date AS DATE)) AS year_of_invoice,
  550.        COUNT(DISTINCT t.name)-- посчитайте уникальное число треков
  551. FROM track AS t
  552. LEFT JOIN invoice_line AS il ON t.track_id = il.track_id
  553. LEFT JOIN invoice AS i ON il.invoice_id = i.invoice_id
  554. GROUP BY year_of_invoice-- добавьте данные для группировки;
  555.  
  556. --3.
  557. --Выгрузите таблицу из двух полей: первое поле с фамилией сотрудника, второе — с количеством пользователей, чьи запросы этот сотрудник обработал. Назовите поля employee_last_name и all_customers соответственно. Сгруппируйте записи по идентификатору сотрудника. Отсортируйте количество пользователей по убыванию.
  558.  
  559. SELECT s.last_name AS employee_last_name,
  560.        COUNT(support_rep_id) AS all_customers
  561. FROM staff AS s
  562. LEFT OUTER JOIN client AS c ON s. employee_id=c.support_rep_id
  563. GROUP BY employee_id
  564. ORDER BY all_customers DESC
  565.  
  566. --4.
  567. --У некоторых сотрудников есть менеджеры — их идентификаторы указаны в поле reports_to. Посмотрите внимательно на схему базы: таблица staff отсылает сама к себе. Это нормально, можно не создавать новую таблицу с менеджерами.
  568. --Теперь можно разобраться в иерархии команды. Отобразите таблицу с двумя полями: в первое поле войдут фамилии всех сотрудников, а во второе — фамилии их менеджеров. Назовите поля employee_last_name и manager_last_name.
  569.  
  570. SELECT s_1.last_name AS employee_last_name,
  571.        s_2.last_name AS manager_last_name
  572. FROM staff AS s_1
  573. LEFT JOIN staff AS s_2 ON s_1.reports_to=s_2.employee_id
  574. GROUP BY employee_last_name,manager_last_name
  575.  
  576. --5.
  577. --Отобразите названия фильмов, в которых снимались актёры и актрисы, не указанные в базе.
  578.  
  579. SELECT m.title
  580. FROM movie AS m
  581. LEFT OUTER JOIN film_actor AS fa ON m.film_id=fa.film_id
  582. LEFT OUTER JOIN actor AS a ON fa.actor_id=a.actor_id
  583. WHERE a.actor_id IS NULL
  584. GROUP BY m.title
  585.  
  586. --6.
  587. --Отобразите на экране имена исполнителей, для которых в базе данных не нашлось ни одного музыкального альбома.
  588.  
  589. SELECT a.name
  590. FROM artist AS a
  591. LEFT OUTER JOIN album AS al ON a.artist_id=al.artist_id
  592. WHERE al.album_id IS NULL
  593. GROUP BY a.name
  594.  
  595. ----THEME 5/7 Lession 1
  596. --1.
  597. --Найдите топ-40 самых длинных фильмов, аренда которых составляет больше 2 долларов. Выведите на экран название фильма (поле title), цену аренды (поле rental_rate), длительность фильма (поле length) и возрастной рейтинг (поле rating).
  598.  
  599. SELECT m.title,
  600.        m.rental_rate,
  601.        m.LENGTH,
  602.        m.rating
  603. FROM movie AS m
  604. WHERE rental_rate > 2
  605. ORDER BY LENGTH DESC
  606. LIMIT 40
  607.  
  608. --2.
  609. --Проанализируйте данные о возрастных рейтингах отобранных фильмов. Выгрузите в итоговую таблицу следующие поля:
  610. возрастной рейтинг (поле rating);
  611. --минимальное и максимальное значения длительности (поле length); назовите поля min_length и max_length соответственно;
  612. --среднее значение длительности (поле length); назовите поле avg_length;
  613. --минимум, максимум и среднее для цены просмотра (поле rental_rate); назовите поля min_rental_rate, max_rental_rate, avg_rental_rate соответственно.
  614. --Отсортируйте среднюю длительность фильма по возрастанию.
  615.  
  616. SELECT top.rating,
  617.        MIN(top.LENGTH) AS min_length,
  618.        MAX(top.LENGTH) AS max_length,
  619.        AVG(top.LENGTH) AS avg_length,
  620.        MIN(top.rental_rate) AS min_rental_rate,
  621.        MAX(top.rental_rate) AS max_rental_rate,
  622.        AVG(top.rental_rate) AS avg_rental_rate
  623. FROM
  624.   (SELECT title,
  625.           rental_rate,
  626.           LENGTH,
  627.           rating
  628.    FROM movie
  629.    WHERE rental_rate > 2
  630.    ORDER BY LENGTH DESC
  631.    LIMIT 40) AS top
  632. GROUP BY top.rating
  633. ORDER BY avg_length;
  634.  
  635. --3.
  636. --Найдите средние значения полей, в которых указаны минимальная и максимальная длительность отобранных фильмов. Отобразите только два этих поля. Назовите их avg_min_length и avg_max_length соответственно.
  637.  
  638. SELECT
  639.        AVG(top_top.min_length) AS avg_min_length,
  640.        AVG(top_top.max_length) AS avg_max_length
  641. FROM
  642. (SELECT top.rating,
  643.        MIN(top.LENGTH) AS min_length,
  644.        MAX(top.LENGTH) AS max_length,
  645.        AVG(top.LENGTH) AS avg_length,
  646.        MIN(top.rental_rate) AS min_rental_rate,
  647.        MAX(top.rental_rate) AS max_rental_rate,
  648.        AVG(top.rental_rate) AS avg_rental_rate
  649. FROM
  650.   (SELECT title,
  651.           rental_rate,
  652.           LENGTH,
  653.           rating
  654.    FROM movie
  655.    WHERE rental_rate > 2
  656.    ORDER BY LENGTH DESC
  657.    LIMIT 40) AS top
  658. GROUP BY top.rating
  659. ORDER BY avg_length) AS top_top
  660. ORDER BY avg_min_length,avg_max_length;
  661.  
  662. --4.
  663. --Отберите альбомы, названия которых содержат слово 'Rock' и его производные. В этих альбомах должно быть восемь или более треков. Выведите на экран одно число — среднее количество композиций в отобранных альбомах.
  664.  
  665. SELECT AVG(rock_top.cn)
  666. FROM
  667. (SELECT a.title,
  668.        COUNT(t.name) AS cn
  669. FROM album AS a
  670. JOIN track AS t ON a.album_id=t.album_id
  671. WHERE a.title LIKE '%Rock%'
  672. GROUP BY a.title
  673. HAVING COUNT(t.name) >=8) AS rock_top;
  674.    
  675. --5.
  676. --Для каждой страны посчитайте среднюю стоимость заказов в 2009 году по месяцам. Отберите данные за 2, 5, 7 и 10 месяцы и сложите средние значения стоимости заказов. Выведите названия стран, у которых это число превышает 10 долларов.
  677.  
  678. SELECT best_table.country
  679. FROM
  680. (SELECT billing_country AS country,
  681.         EXTRACT (MONTH FROM invoice_date::TIMESTAMP) AS month_cost,
  682.         AVG(total) AS average_total
  683. FROM invoice
  684. WHERE EXTRACT (YEAR FROM invoice_date::TIMESTAMP) = '2009'
  685. GROUP BY billing_country,
  686.          month_cost
  687. ) AS best_table
  688. WHERE best_table.month_cost IN (2, 5, 7, 10)
  689. GROUP BY country
  690. HAVING SUM(average_total)>10;
  691.  
  692. ----THEME 5/7 Lession 2
  693.  
  694. --1.
  695. --Вы уже сравнивали выручку в разных странах, но теперь можно усовершенствовать запросы.
  696. --Напишите код для первого подзапроса. Таблица invoice_line хранит информацию о купленных треках. Выгрузите из неё только те заказы (поле invoice_id), которые включают больше пяти треков.
  697.  
  698. SELECT invoice_id
  699. FROM invoice_line
  700. GROUP BY invoice_id
  701. HAVING COUNT(track_id) > 5;
  702.  
  703. --2.
  704. --Теперь напишите код для второго подзапроса. С помощью той же таблицы найдите среднее значение цены одного трека (поле unit_price).
  705.  
  706. SELECT AVG(unit_price)
  707. FROM invoice_line
  708.  
  709. --3.
  710. --Для каждой страны (поле billing_country) посчитайте минимальное, максимальное и среднее значение выручки из поля total. Назовите поля так: min_total, max_total и avg_total. Нужные поля для выгрузки хранит таблица invoice.
  711. --При подсчёте учитывайте только те заказы, которые включают более пяти треков. Стоимость заказа должна превышать среднюю цену одного трека. Используйте код, написанный в предыдущих заданиях.
  712. --Отсортируйте итоговую таблицу по значению в поле avg_total от большего к меньшему.
  713.  
  714. SELECT billing_country,
  715.        MIN(total) AS min_total,
  716.        MAX(total) AS max_total,
  717.        AVG(total) AS avg_total
  718. FROM invoice
  719. WHERE invoice_id IN (SELECT invoice_id
  720. FROM invoice_line
  721. GROUP BY invoice_id
  722. HAVING COUNT(track_id) > 5)
  723. AND total > (SELECT AVG(unit_price)
  724. FROM invoice_line)
  725. GROUP BY billing_country
  726. ORDER BY avg_total DESC;
  727.  
  728. --4.
  729. --Отберите десять самых коротких по продолжительности треков и выгрузите названия их жанров.
  730.  
  731. SELECT name
  732. FROM genre
  733. WHERE genre_id IN
  734.           (SELECT genre_id
  735.           FROM track
  736.           GROUP BY genre_id
  737.           ORDER BY MIN(milliseconds)
  738.           LIMIT 5)
  739. GROUP BY name
  740.  
  741. --5.
  742. --Выгрузите уникальные названия городов, в которых стоимость заказов превышает среднее значение за 2009 год.
  743.  
  744. SELECT DISTINCT billing_city
  745. FROM invoice
  746. WHERE total >
  747. (SELECT AVG(total)
  748. FROM invoice
  749. WHERE EXTRACT (YEAR FROM invoice_date::TIMESTAMP) = '2009');
  750.  
  751. --6.
  752. --Найдите возрастной рейтинг с самыми дорогими для аренды фильмами. Для этого посчитайте среднюю стоимость аренды фильма каждого рейтинга. Выведите на экран названия категорий фильмов с этим рейтингом. Добавьте второе поле со средним значением продолжительности фильмов.
  753.  
  754. SELECT c.name,
  755.        AVG(m.LENGTH)
  756. FROM movie m
  757. LEFT JOIN film_category fc ON m.film_id = fc.film_id
  758. LEFT JOIN category c ON fc.category_id = c.category_id
  759. WHERE m.rating IN (
  760.             SELECT rating
  761.             FROM movie
  762.             GROUP BY rating
  763.             ORDER BY AVG(rental_rate) DESC
  764.             LIMIT 1)
  765. GROUP BY c.name
  766.  
  767. ----THEME 5/7 Lession 3
  768. --1.
  769. --Составьте сводную таблицу. Посчитайте заказы, оформленные за каждый месяц в течение нескольких лет: с 2011 по 2013 год. Итоговая таблица должна включать четыре поля: invoice_month, year_2011, year_2012, year_2013. Поле invoice_month должно хранить месяц в виде числа от 1 до 12.
  770. --Если в какой-либо месяц заказы не оформляли, номер такого месяца всё равно должен попасть в таблицу.
  771. --В этом задании не будет подсказок. Используйте любые методы, которые посчитаете нужными.
  772.  
  773. SELECT invoice_month,
  774.        year_2011,
  775.        year_2012,
  776.        year_2013
  777. FROM (SELECT invoice_month,
  778.        year_2011,
  779.        year_2012
  780. FROM (SELECT EXTRACT(MONTH FROM CAST(invoice_date AS DATE)) AS invoice_month,
  781.        COUNT(*) AS year_2011
  782. FROM invoice
  783. WHERE EXTRACT(YEAR FROM CAST(invoice_date AS DATE)) = '2011'
  784. GROUP BY invoice_month) AS y11
  785. JOIN (SELECT EXTRACT(MONTH FROM CAST(invoice_date AS DATE)) AS invoice_month_2,
  786.        COUNT(*) AS year_2012
  787. FROM invoice
  788. WHERE EXTRACT(YEAR FROM CAST(invoice_date AS DATE)) = '2012'
  789. GROUP BY invoice_month_2) AS y12 ON y11.invoice_month=y12.invoice_month_2) AS y11_12
  790. JOIN (SELECT EXTRACT(MONTH FROM CAST(invoice_date AS DATE)) AS invoice_month_3,
  791.        COUNT(*) AS year_2013
  792. FROM invoice
  793. WHERE EXTRACT(YEAR FROM CAST(invoice_date AS DATE)) = '2013'
  794. GROUP BY invoice_month_3) AS y13 ON y11_12.invoice_month=y13.invoice_month_3
  795.  
  796. --2.
  797. --Отберите фамилии пользователей, которые:
  798. --оформили хотя бы один заказ в январе 2013 года, а также сделали хотя бы один заказ в остальные месяцы того же года.
  799. --Пользователей, которые оформили заказы только в январе, а в остальное время ничего не заказывали, в таблицу включать не нужно.
  800.  
  801.  
  802. SELECT DISTINCT c.last_name
  803. FROM invoice AS i
  804. LEFT JOIN client AS c ON i.customer_id = c.customer_id
  805. WHERE i.customer_id IN
  806.     (SELECT customer_id
  807.      FROM invoice
  808.      WHERE CAST(invoice_date AS DATE) BETWEEN '2013-01-01' AND '2013-01-31' ) -- тут можно фильтровать по строкам вида '2013-01-01'
  809.      AND CAST(invoice_date AS DATE) BETWEEN '2013-02-01' AND '2013-12-31';
  810.  
  811. --3.
  812. --Сформируйте статистику по категориям фильмов. Отобразите в итоговой таблице два поля:
  813. --название категории;
  814. --число фильмов из этой категории.
  815. --Фильмы для второго поля нужно отобрать по условию. Посчитайте фильмы только с теми актёрами и актрисами, которые больше семи раз снимались в фильмах, вышедших после 2013 года.
  816. --Назовите поля name_category и total_films соответственно. Отсортируйте таблицу по количеству фильмов от большего к меньшему, а затем по полю с названием категории в лексикографическом порядке.
  817.  
  818. SELECT c.name AS name_category,
  819.        COUNT(DISTINCT m.film_id) AS total_films
  820. FROM movie AS m LEFT JOIN film_actor AS fa ON fa.film_id=m.film_id
  821. LEFT JOIN actor AS a ON fa.actor_id = a.actor_id
  822. LEFT JOIN film_category AS fc ON fa.film_id = fc.film_id
  823. LEFT JOIN category AS c ON fc.category_id = c.category_id
  824. WHERE a.actor_id IN (SELECT a.actor_id
  825.                      FROM movie AS m LEFT JOIN film_actor AS fa ON fa.film_id=m.film_id
  826.                      LEFT JOIN actor AS a ON a.actor_id=fa.actor_id
  827.                      WHERE m.release_year > 2013
  828.                      GROUP BY a.actor_id
  829.                      HAVING COUNT(m.film_id) >7)
  830. GROUP BY c.name
  831. ORDER BY total_films DESC,
  832.          name_category;
  833.  
  834. --4.
  835. --Определите, летом какого года общая выручка в магазине была максимальной. Затем проанализируйте данные за этот год по странам. --Выгрузите таблицу с полями:
  836. --country — название страны;
  837. --total_invoice — число заказов, оформленных в этой стране в тот год, когда общая выручка за лето была максимальной;
  838. --total_customer — число клиентов, зарегистрированных в этой стране.
  839. --Отсортируйте таблицу по убыванию значений в поле total_invoice, а затем добавьте сортировку по названию страны в лексикографическом порядке.
  840.  
  841. SELECT i.billing_country AS country,
  842.        COUNT(i.total) AS total_invoice,
  843.        one.total_customer
  844. FROM invoice AS i
  845. LEFT JOIN (SELECT country,
  846.            COUNT(customer_id) AS total_customer
  847.            FROM client
  848.            GROUP BY country) AS one ON i.billing_country=one.country
  849. WHERE EXTRACT(YEAR FROM CAST(invoice_date AS DATE)) =
  850. (SELECT EXTRACT(YEAR FROM CAST(invoice_date AS DATE)) AS yy
  851. FROM invoice AS i
  852. WHERE EXTRACT(MONTH FROM CAST(invoice_date AS DATE)) > 5
  853.   AND EXTRACT(MONTH FROM CAST(invoice_date AS DATE)) < 9
  854. GROUP BY yy
  855. ORDER BY SUM(total) DESC
  856. LIMIT 1)
  857.  
  858. GROUP BY i.billing_country, one.total_customer
  859. ORDER BY total_invoice DESC,
  860.          i.billing_country
  861.  
  862. --1.
  863. --Перепишите один из своих прошлых запросов с использованием оператора WITH.
  864. --Выведите топ-40 самых длинных фильмов, аренда которых составляет больше 2 долларов. Проанализируйте данные о возрастных рейтингах отобранных фильмов. Выгрузите в итоговую таблицу следующие поля:
  865. --возрастной рейтинг (поле rating);
  866. --минимальное и максимальное значения длительности (поле length), назовите поля min_length и max_length соответственно;
  867. --среднее значение длительности (поле length), назовите поле avg_length;
  868. --минимум, максимум и среднее для цены просмотра (поле rental_rate), назовите поля min_rental_rate, max_rental_rate, avg_rental_rate соответственно.
  869. --Отсортируйте среднюю длительность фильма по возрастанию.
  870.  
  871. ----THEME 5/7 Lession 4
  872.  
  873. WITH
  874. i AS (
  875. SELECT
  876.     rating,
  877.     LENGTH,
  878.     rental_rate
  879. FROM movie AS m
  880. WHERE rental_rate > 2
  881. ORDER BY LENGTH DESC
  882. limit 40
  883. ),
  884. c AS (
  885. SELECT rating,
  886. MIN(LENGTH) AS min_length ,
  887. MAX(LENGTH) AS max_length ,
  888. AVG(LENGTH) AS avg_length ,
  889. MIN(rental_rate) AS min_rental_rate ,
  890. MAX(rental_rate) AS max_rental_rate ,
  891. AVG(rental_rate) AS avg_rental_rate
  892. FROM i
  893. GROUP BY rating
  894. )
  895. SELECT c.rating, c.min_length, c.max_length, c.avg_length, c.min_rental_rate, c.max_rental_rate, c.avg_rental_rate
  896. FROM c
  897. ORDER BY c.avg_length;
  898.  
  899.  
  900. --3.
  901. --Проанализируйте данные из таблицы invoice за 2012 и 2013 годы. В итоговую таблицу должны войти поля:
  902. --month — номер месяца;
  903. --sum_total_2012 — выручка за этот месяц в 2012 году;
  904. --sum_total_2013 — выручка за этот месяц в 2013 году;
  905. --perc — процент, который отображает, насколько изменилась месячная выручка в 2013 году по сравнению с 2012 годом.
  906. --Округлите значение в поле perc до ближайшего целого числа. Отсортируйте таблицу по значению в поле month от меньшего к большему.
  907.  
  908. WITH
  909. t_2012 AS (SELECT EXTRACT (MONTH FROM invoice_date::TIMESTAMP) AS MONTH,
  910.                       SUM(total) AS sum_t_2012
  911.                FROM invoice
  912.                WHERE EXTRACT (YEAR FROM invoice_date::TIMESTAMP) = '2012'
  913.                GROUP BY MONTH),
  914.  
  915. t_2013 AS (SELECT EXTRACT (MONTH FROM invoice_date::TIMESTAMP) AS MONTH,
  916.                       SUM(total) AS sum_t_2013
  917.                FROM invoice
  918.                WHERE EXTRACT (YEAR FROM invoice_date::TIMESTAMP) = '2013'
  919.                GROUP BY MONTH)
  920.  
  921. SELECT t_2012.MONTH,
  922.        t_2012.sum_t_2012,
  923.        t_2013.sum_t_2013,
  924.        ROUND((t_2013.sum_t_2013 - t_2012.sum_t_2012)/t_2012.sum_t_2012*100) AS perc
  925. FROM t_2012
  926. JOIN t_2013 ON t_2012.MONTH=t_2013.MONTH
  927. ORDER BY t_2012.MONTH;
  928.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement