Решение модуля 2.4 из курса «Интерактивный тренажер по SQL»

Разобрали ответы и решения урока 2.4(База данных «Интернет-магазин книг», запросы на выборку) под курс «Интерактивный тренажер по SQL».

Предыдущий разбор модуля 2.3 следующий разбор модуль 2.5

Установите связи между информационными объектами Жанр и КнигаГород и КлиентЗаказ и Этапы. Выберите верную концептуальную схему.

Решение модуля 2.4 из курса «Интерактивный тренажер по SQL»

Сопоставьте фрагменты концептуальной модели с фрагментами логической модели.

В этом задании все просто можно орентироваться на названия таблиц и будет все понятно

Вывести все заказы Баранова Павла (id заказа, какие книги, по какой цене и в каком количестве он заказал) в отсортированном по номеру заказа и названиям книг виде.

SELECT buy_book.buy_id, title, price, buy_book.amount
FROM 
    client 
    INNER JOIN buy ON client.client_id = buy.client_id
    INNER JOIN buy_book ON buy_book.buy_id = buy.buy_id
    INNER JOIN book ON buy_book.book_id=book.book_id
WHERE name_client LIKE 'Баранов Павел'
ORDER BY buy_book.buy_id, title;

Посчитать, сколько раз была заказана каждая книга, для книги вывести ее автора (нужно посчитать, в каком количестве заказов фигурирует каждая книга).  Вывести фамилию и инициалы автора, название книги, последний столбец назвать Количество. Результат отсортировать сначала  по фамилиям авторов, а потом по названиям книг.

SELECT author.name_author, book.title, COUNT(buy_book.book_id) AS Количество
FROM
    book
    INNER JOIN author ON author.author_id = book.author_id
    LEFT JOIN buy_book ON buy_book.book_id = book.book_id
    LEFT JOIN buy ON buy.buy_id = buy_book.buy_id
GROUP BY author.name_author, book.title
ORDER BY author.name_author, book.title

Вывести города, в которых живут клиенты, оформлявшие заказы в интернет-магазине. Указать количество заказов в каждый город, этот столбец назвать Количество. Информацию вывести по убыванию количества заказов, а затем в алфавитном порядке по названию городов.

SELECT city.name_city, COUNT(client_id) AS Количество
FROM buy
    INNER JOIN client USING (client_id)
    INNER JOIN city USING (city_id)
GROUP BY buy.client_id
ORDER BY Количество DESC, name_city;

Вывести номера всех оплаченных заказов и даты, когда они были оплачены.

SELECT buy_id, date_step_end 
FROM step
    INNER JOIN buy_step ON step.step_id = buy_step.step_id
WHERE buy_step.step_id = 1 and date_step_end IS NOT Null;

Вывести информацию о каждом заказе: его номер, кто его сформировал (фамилия пользователя) и его стоимость (сумма произведений количества заказанных книг и их цены), в отсортированном по номеру заказа виде. Последний столбец назвать Стоимость.

SELECT buy_id, name_client, SUM(price * buy_book.amount) as Стоимость
FROM buy
    INNER JOIN client using(client_id)
    INNER JOIN buy_book using(buy_id)
    INNER JOIN book using(book_id)
GROUP BY buy_book.buy_id
ORDER BY 1;

Вывести номера заказов (buy_id) и названия этапов,  на которых они в данный момент находятся. Если заказ доставлен –  информацию о нем не выводить. Информацию отсортировать по возрастанию buy_id.

SELECT buy_id, name_step
FROM buy_step
     JOIN step USING(step_id)
WHERE date_step_beg IS NOT NULL and date_step_end IS NULL
ORDER BY buy_id

В таблице city для каждого города указано количество дней, за которые заказ может быть доставлен в этот город (рассматривается только этап Транспортировка). Для тех заказов, которые прошли этап транспортировки, вывести количество дней за которое заказ реально доставлен в город. А также, если заказ доставлен с опозданием, указать количество дней задержки, в противном случае вывести 0. В результат включить номер заказа (buy_id), а также вычисляемые столбцы Количество_дней и Опоздание. Информацию вывести в отсортированном по номеру заказа виде.

SELECT buy_id, DATEDIFF(date_step_end, date_step_beg) AS Количество_дней, 
        IF(DATEDIFF(date_step_end, date_step_beg)<=days_delivery, 0, DATEDIFF(date_step_end, date_step_beg) -               days_delivery) AS Опоздание
FROM buy_step JOIN buy USING(buy_id)
              JOIN client USING(client_id)
              JOIN city USING(city_id)              
WHERE step_id=3 AND DATEDIFF(date_step_end, date_step_beg) IS NOT NULL
ORDER BY 1

Выбрать всех клиентов, которые заказывали книги Достоевского, информацию вывести в отсортированном по алфавиту виде. В решении используйте фамилию автора, а не его id.

SELECT DISTINCT name_client
FROM client
    INNER JOIN buy USING (client_id)
    INNER JOIN buy_book USING (buy_id)
    INNER JOIN book USING (book_id)
    INNER JOIN author USING (author_id)
WHERE name_author LIKE "Достоевский%"
ORDER BY name_client;

Вывести жанр (или жанры), в котором было заказано больше всего экземпляров книг, указать это количество. Последний столбец назвать Количество.

SELECT name_genre, SUM(buy_book.amount) as Количество
FROM genre JOIN book USING(genre_id)
    JOIN buy_book USING(book_id)
GROUP BY name_genre
limit 1

Сравнить ежемесячную выручку от продажи книг за текущий и предыдущий годы. Для этого вывести год, месяц, сумму выручки в отсортированном сначала по возрастанию месяцев, затем по возрастанию лет виде. Название столбцов: ГодМесяцСумма.

SELECT YEAR(date_payment) AS Год,
	   MONTHNAME(date_payment) AS Месяц,
	   SUM(amount*price) AS Сумма
FROM buy_archive
GROUP BY Год, Месяц

UNION ALL
SELECT YEAR(date_step_end) AS Год,
	   MONTHNAME(date_step_end) AS Месяц,
	   SUM(bb.amount*price) AS Сумма
FROM buy_book bb
      JOIN buy_step bs ON bb.buy_id = bs.buy_id 
  				  AND bs.date_step_end 
  				  AND bs.step_id = 1
      JOIN book USING(book_id)
GROUP BY Год, Месяц
ORDER BY Месяц, Год;

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

WITH Title_sales AS (
SELECT title, buy_book.amount, price
FROM book
    INNER JOIN buy_book USING(book_id)
    INNER JOIN buy USING(buy_id) 
    INNER JOIN buy_step USING(buy_id)
    INNER JOIN step USING(step_id)
WHERE  date_step_end IS NOT Null and name_step = "Оплата"
    
UNION ALL
    
SELECT title, buy_archive.amount, buy_archive.price
    FROM buy_archive
    INNER JOIN book USING(book_id)
)
SELECT title, SUM(amount) AS Количество, SUM(amount*price) AS Сумма
FROM Title_sales
GROUP BY title
ORDER BY Сумма DESC;

Если у вас не отображается решение последних задач, значит у вас включен блокировщик рекламы который вырезает эти ответы

Понравилась статья? Поделиться с друзьями:
Подписаться
Уведомить о
guest

5 комментариев
Новые
Старые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Yurii
Yurii
6 месяцев назад

Вывести жанр (или жанры), в котором было заказано больше всего экземпляров книг, указать это количество. Последний столбец назвать Количество.

SELECT name_genre, Количество
FROM (
  SELECT name_genre, SUM(buy_book.amount) as Количество,
      ROW_NUMBER() OVER (ORDER BY SUM(buy_book.amount) DESC) AS row_num
  FROM genre
  JOIN book USING(genre_id)
  JOIN buy_book USING(book_id)
  GROUP BY name_genre
) AS subquery
WHERE row_num = 1;

Димундель
Димундель
9 месяцев назад

Вывести жанр (или жанры), в котором было заказано больше всего экземпляров книг, указать это количество. Последний столбец назвать Количество.
SELECT name_genre, SUM(buy_book.amount) AS Количество
FROM 
  genre 
  INNER JOIN book USING(genre_id)
  INNER JOIN buy_book USING(book_id)
     GROUP BY name_genre  
      
HAVING SUM(buy_book.amount) = 
   (/* вычисляем максимальное количество по жанру */
   SELECT MAX(sum_amount) 
   FROM 
     (/* считаем количество по жанру */
      SELECT SUM(buy_book.amount) AS sum_amount 
      FROM buy_book JOIN book USING(book_id) 
       GROUP BY genre_id)
     query_in
   );
 

hellfack
hellfack
9 месяцев назад

Для каждой отдельной книги необходимо вывести информацию о количестве проданных экземпляров и их стоимости за 2020 и 2019 год . Вычисляемые столбцы назвать Количество и Сумма. Информацию отсортировать по убыванию стоимости.

SELECT title, SUM(Количество) AS Количество, SUM(Сумма) AS Сумма
FROM (SELECT book.title, SUM(buy_book.amount) AS Количество, SUM(book.price*buy_book.amount) AS Сумма
   FROM buy_book
     INNER JOIN book USING (book_id)
     INNER JOIN buy USING(buy_id)
     INNER JOIN buy_step USING(buy_id)
     INNER JOIN step USING(step_id)
   WHERE name_step =’Оплата’ AND date_step_end IS NOT NULL
GROUP BY book.title
UNION ALL
SELECT book.title, SUM(buy_archive.amount) AS Количество, SUM(buy_archive.price*buy_archive.amount) AS Сумма
    FROM buy_archive
      INNER JOIN book USING (book_id)
GROUP BY book.title) AS qwert
GROUP BY title
ORDER BY Сумма DESC

авав
авав
9 месяцев назад

Вывести жанр (или жанры), в котором было заказано больше всего экземпляров книг, указать это количество. Последний столбец назвать Количество. от этого чет ответ не потходит


Mysteike
Mysteike
9 месяцев назад

Сравнить ежемесячную выручку от продажи книг за текущий и предыдущий годы. Для этого вывести год, месяц, сумму выручки в отсортированном сначала по возрастанию месяцев, затем по возрастанию лет виде. Название столбцов: ГодМесяцСумма:

SELECT YEAR(date_payment) Год, MONTHNAME(date_payment) Месяц, SUM(price*amount) Сумма
FROM buy_archive
GROUP BY Год, Месяц
UNION
SELECT YEAR(date_step_beg) Год, MONTHNAME(date_step_beg) Месяц, SUM(book.price*buy_book.amount) Сумма
FROM book
INNER JOIN buy_book USING(book_id)
INNER JOIN buy_step USING(buy_id)
INNER JOIN step USING(step_id)
WHERE name_step=’Оплата’ AND date_step_end IS NOT NULL
GROUP BY Год, Месяц
ORDER BY 2 ASC, 1 ASC

5
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x