Skip to content

Commit e0e8c46

Browse files
committed
add: 1.7 solutions
1 parent 003bb11 commit e0e8c46

File tree

1 file changed

+62
-10
lines changed
  • 1. The relational model/1.7 Traffic violations table

1 file changed

+62
-10
lines changed

1. The relational model/1.7 Traffic violations table/solutions.sql

Lines changed: 62 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,15 @@
66
sum_fine вещественное число, максимальная длина 8, количество знаков после запятой 2
77
date_violation дата
88
date_payment дата */
9-
9+
CREATE TABLE fine (
10+
fine_id INT PRIMARY KEY AUTO_INCREMENT,
11+
`name` VARCHAR(30),
12+
number_plate VARCHAR(6),
13+
violation VARCHAR(50),
14+
sum_fine DECIMAL(8,2),
15+
date_violation DATE,
16+
date_payment DATE
17+
);
1018

1119
/* В таблицу fine первые 5 строк уже занесены. Добавить в таблицу записи 6, 7, 8.
1220
+---------------+--------------+----------------------------------+----------+------------------+--------------+
@@ -22,16 +30,60 @@
2230
| Яковлев Г.Р. | Т330ТТ | Проезд на запрещающий сигнал | None | 2020-03-03 | None |
2331
+---------------+--------------+----------------------------------+----------+------------------+--------------+
2432
Affected rows: 3 */
33+
INSERT INTO fine(name, number_plate, violation, sum_fine, date_violation, date_payment)
34+
VALUES ('Баранов П.Е.', 'Р523ВТ', 'Превышение скорости(от 40 до 60)', NULL, '2020-02-14', NULL),
35+
('Абрамова К.А.', 'О111АВ', 'Проезд на запрещающий сигнал', NULL, '2020-02-23', NULL),
36+
('Яковлев Г.Р.', 'Т330ТТ', 'Проезд на запрещающий сигнал', NULL, '2020-03-03', NULL);
2537

26-
27-
/* Занести в таблицу fine суммы штрафов, которые должен оплатить водитель,
28-
в соответствии с данными из таблицы traffic_violation.
38+
/* Занести в таблицу fine суммы штрафов, которые должен оплатить водитель, в соответствии с данными из таблицы traffic_violation.
2939
При этом суммы заносить только в пустые поля столбца sum_fine. */
40+
UPDATE fine f, traffic_violation tv SET f.sum_fine = tv.sum_fine
41+
WHERE f.violation = tv.violation AND f.sum_fine IS NULL;
3042

31-
32-
/* Вывести фамилию, номер машины и нарушение только для тех водителей,
33-
которые на одной машине нарушили одно и то же правило два и более раз.
34-
При этом учитывать все нарушения, независимо от того оплачены они или нет.
35-
Информацию отсортировать в алфавитном порядке, сначала по фамилии водителя,
43+
/* Вывести фамилию, номер машины и нарушение только для тех водителей, которые на одной машине нарушили одно и то же правило два и более раз.
44+
При этом учитывать все нарушения, независимо от того оплачены они или нет. Информацию отсортировать в алфавитном порядке, сначала по фамилии водителя,
3645
потом по номеру машины и, наконец, по нарушению. */
37-
46+
SELECT `name`, number_plate, violation -- COUNT(*)
47+
FROM fine
48+
GROUP BY `name`, number_plate, violation
49+
HAVING COUNT(*) >= 2
50+
ORDER BY `name`, number_plate, violation;
51+
52+
-- В таблице fine увеличить в два раза сумму неоплаченных штрафов для отобранных на предыдущем шаге записей.
53+
UPDATE fine,
54+
(SELECT name, number_plate, violation
55+
FROM fine
56+
GROUP BY name, number_plate, violation
57+
HAVING COUNT(violation) >= 2
58+
ORDER BY name, number_plate, violation) AS qin
59+
SET fine.sum_fine = fine.sum_fine * 2
60+
WHERE fine.name = qin.name
61+
AND fine.number_plate = qin.number_plate
62+
AND fine.violation = qin.violation
63+
AND fine.date_payment IS NULL;
64+
65+
/* В таблицу fine занести дату оплаты соответствующего штрафа из таблицы payment; Уменьшить начисленный штраф в таблице fine в два раза
66+
(только для тех штрафов, информация о которых занесена в таблицу payment) , если оплата произведена не позднее 20 дней со дня нарушения. */
67+
UPDATE fine f, payment p
68+
SET f.date_payment = p.date_payment,
69+
f.sum_fine = IF((DATEDIFF(p.date_payment, f.date_violation)) <= 20, f.sum_fine / 2, f.sum_fine)
70+
WHERE f.name = p.name
71+
AND f.number_plate = p.number_plate
72+
AND f.violation = p.violation
73+
AND f.date_payment IS NULL;
74+
75+
/* Создать новую таблицу back_payment, куда внести информацию о неоплаченных штрафах
76+
(Фамилию и инициалы водителя, номер машины, нарушение, сумму штрафа и дату нарушения) из таблицы fine. */
77+
-- 1 variant
78+
CREATE TABLE back_payment AS
79+
(SELECT name, number_plate, violation, sum_fine, date_violation
80+
FROM fine
81+
WHERE date_payment IS NULL);
82+
-- SELECT * FROM back_payment;
83+
-- 2 variant
84+
CREATE TABLE back_payment(SELECT * FROM fine WHERE ISNULL(date_payment));
85+
ALTER TABLE back_payment DROP fine_id, DROP date_payment;
86+
87+
/* Удалить из таблицы fine информацию о нарушениях, совершенных раньше 1 февраля 2020 года. */
88+
DELETE FROM fine
89+
WHERE DATEDIFF(date_violation, '2020-02-01') < 0;

0 commit comments

Comments
 (0)