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 +---------------+--------------+----------------------------------+----------+------------------+--------------+
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