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

Разобрали ответы и решения урока 1.7(Таблица «Нарушения ПДД», запросы корректировки) под курс «Интерактивный тренажер по SQL».

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

Создать таблицу fine следующей структуры:

fine_id
ключевой столбец целого типа с автоматическим увеличением значения ключа на 1
name
строка длиной 30
number_plate
строка длиной 6
violation
строка длиной 50
sum_fine
вещественное число, максимальная длина 8, количество знаков после запятой 2
date_violation
дата
date_payment
дата
CREATE TABLE fine
(
    fine_id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(30),
    number_plate VARCHAR(6),
    violation VARCHAR(30),
    sum_fine DECIMAL(8,2),
    date_violation DATE,
    date_payment DATE
)

В таблицу fine первые 5 строк уже занесены. Добавить в таблицу записи с ключевыми значениями 6, 7, 8.

INSERT INTO fine
(name, number_plate, violation, date_violation)
VALUES
('Баранов П.Е.', 'Р523ВТ', 'Превышение скорости(от 40 до 60)', '2020-02-14'),
('Абрамова К.А.', 'О111АВ', 'Проезд на запрещающий сигнал', '2020-02-23'),
('Яковлев Г.Р.', 'Т330ТТ', 'Проезд на запрещающий сигнал', '2020-03-03');

SELECT * FROM fine;

Занести в таблицу fine суммы штрафов, которые должен оплатить водитель, в соответствии с данными из таблицы traffic_violation. При этом суммы заносить только в пустые поля столбца  sum_fine.

UPDATE fine f, 
    traffic_violation tv
SET f.sum_fine = tv.sum_fine
WHERE f.violation = tv.violation 
    AND f.sum_fine IS NULL;

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

SELECT name, number_plate, violation
FROM fine
GROUP by name, number_plate, violation
HAVING count(violation) >= 2
ORDER by name, number_plate, violation

В таблице fine увеличить в два раза сумму неоплаченных штрафов для отобранных на предыдущем шаге записей. 

UPDATE fine AS f, (
	   SELECT name, number_plate, violation
  		 FROM fine
 		GROUP BY name, number_plate, violation
	   HAVING count(*) >= 2
	   ) AS dv
   SET f.sum_fine = f.sum_fine*2
 WHERE f.date_payment IS Null
	   AND (f.name = dv.name
	   AND f.violation = dv.violation);

SELECT * FROM fine;

Водители оплачивают свои штрафы. В таблице payment занесены даты их оплаты:
Необходимо:
— в таблицу fine занести дату оплаты соответствующего штрафа из таблицы payment;
— уменьшить начисленный штраф в таблице fine в два раза (только для тех штрафов, информация о которых занесена в таблицу payment) , если оплата произведена не позднее 20 дней со дня нарушения.

UPDATE fine f, payment p
SET f.date_payment = p.date_payment,
    f.sum_fine = IF(DATEDIFF(f.date_payment, f.date_violation) <= 20, f.sum_fine / 2, f.sum_fine)
WHERE f.name = p.name AND
      f.number_plate = p.number_plate AND
      f.violation = p.violation AND
      f.date_violation = p.date_violation AND
      f.date_payment IS NULL;

SELECT name, violation, sum_fine, date_violation, date_payment
FROM fine;

Создать новую таблицу back_payment, куда внести информацию о неоплаченных штрафах (Фамилию и инициалы водителя, номер машины, нарушение, сумму штрафа  и  дату нарушения) из таблицы fine.

CREATE TABLE back_payment
    (SELECT name, number_plate, violation, sum_fine, date_violation
     FROM fine
     WHERE date_payment IS NULL);
     
SELECT * FROM back_payment

Удалить из таблицы fine информацию о нарушениях, совершенных раньше 1 февраля 2020 года. 

DELETE FROM fine
WHERE date_violation < DATE(20200201) AND date_payment IS NOT NULL;
Понравилась статья? Поделиться с друзьями:
Подписаться
Уведомить о
guest

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

SELECT Ключевое_слово, Урок, Ссылка
FROM (
SELECT Ключевое_слово, Урок, Ссылка, ROW_NUMBER() OVER(PARTITION BY Ключевое_слово ORDER BY m, l, s) AS num_row
FROM (
SELECT keyword_name AS Ключевое_слово,
CONCAT(module_id,‘.’,lesson_position,«.»,step_position,» «,CONCAT(LEFT(step_name,70),«…»)) AS Урок,
link AS Ссылка, module_id AS m, lesson_position AS l, step_position AS s
FROM step
INNER JOIN lesson USING(lesson_id)
INNER JOIN module USING(module_id)
INNER JOIN step_keyword USING(step_id)
INNER JOIN keyword USING(keyword_id)
) all_keywords
) add_num_row
WHERE num_row = 1;

Сергей
Сергей
5 месяцев назад

Предпоследнее:
CREATE TABLE back_payment AS
SELECT name, number_plate, violation, sum_fine, date_violation
FROM fine
WHERE date_payment IS NULL;
SELECT name, number_plate, violation, sum_fine, date_violation
FROM back_payment;

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