powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Неправильный вывод соответствующих строк. Ошибки в построении запросов.
3 сообщений из 3, страница 1 из 1
Неправильный вывод соответствующих строк. Ошибки в построении запросов.
    #39902248
SentinOS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Есть таблицы данного вида:


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
CREATE TABLE Workers
(
	Id INTEGER AUTO_INCREMENT PRIMARY KEY,
	FIO VARCHAR(100) NOT NULL,
	address VARCHAR(100) NOT NULL,
	phone VARCHAR(100) NOT NULL,
	birthday DATE NOT NULL,
	employmentDate DATE NOT NULL
);

CREATE TABLE Works
(
	Id INTEGER AUTO_INCREMENT PRIMARY KEY,
	typeOf VARCHAR(100) NOT NULL,
	descriptionOf VARCHAR(100) NOT NULL,
	upperLimitOfPayment DECIMAL NOT NULL,
	lowerLimitOfPayment DECIMAL NOT NULL
);

CREATE TABLE Payments
(
	Id INTEGER AUTO_INCREMENT PRIMARY KEY,
	id_work INTEGER,
	id_worker INTEGER,
	countOf INTEGER NOT NULL,
	dateOf DATE NOT NULL,
	taxes INTEGER DEFAULT(0),
	taxExemption VARCHAR(100),
	CONSTRAINT FK_work FOREIGN KEY (id_work) REFERENCES Works(Id) ON DELETE CASCADE,
	CONSTRAINT FK_worker FOREIGN KEY (id_worker) REFERENCES Workers(Id) ON DELETE CASCADE
);



Заполнены данными:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
INSERT Workers(FIO, address, phone, birthday, employmentDate)
VALUES
('В. В. Фельдш', 'г. Коряжма, улица Пушкина, дом Колотушкина', '88005553535', '1996-10-24', '2015-03-10'),
('Д. К. Албутенко', 'г. Ульяновск, улица Полбина, дом Воробина', '88006789999', '1980-10-25', '2016-04-14'),
('А. В. Алышкенко', 'г. Саратов, улица Васильева, дом Калиева', '81234567890', '1960-01-01', '2010-03-15'),
('Е. Н. Новицкицецкая', 'г. Анопка, улица Вавилова, дом Дельфинова', '88009586941', '1985-09-01', '2014-10-10'),
('Ю. С. Ульмешкин', 'г. Барыш, улица Пересмешкина, дом Пельмешкина', '86787658123', '1986-12-12', '2018-05-05'),
('Д. К. Доузи-Никушенко', 'г. Барыш, улица Болотная, дом Холодный', '86578964579', '2000-11-24', '2019-08-13'),
('Н. К. Абдулкаюмович', 'г. Тольятти, улица Биллионера, дом Миллионера', '80986589303', '1995-01-05', '2013-12-12'),
('К. В. Абдуалевенко', 'г. Ульяновск, улица Водопроводная, дом Странный', '89678967431', '1989-02-25', '2012-02-20'),
('А. С. Чернуха', 'г. Пенза, улица Кобыльная, дом Воротильный', '86666666666', '1979-03-25', '2016-06-06'),
('Е. Н. Понасенков', 'г. Москва, улица Маэстро, дом Гениальный', '89212341236', '1982-03-13', '2019-08-10')

INSERT Works(typeOf, descriptionOf, lowerLimitOfPayment, upperLimitOfPayment)
VALUES
('Кошение травы', 'Скосить 10 соток травы на дачном участке директора', 50, 150),
('Выкапывание картофеля', 'Вскопать 10 соток картофеля на дачном участке директора', 100, 250),
('Построить забор', 'Обнести участок клиента забором', 400, 600),
('Сборка стола', 'Собрать стол клиенту', 25, 100),
('Сборка стула', 'Собрать стул клиенту', 10, 50),
('Полив цветов', 'Полить цветы на участке клиента', 50, 100),
('Настройка компьютера', 'Провести полное обслуживание компьютера клиента', 30, 90),
('Залив катка', 'Залить каток на участке клиента', 250, 400),
('Подключение услуги Интернет', 'Подключение и настройка Интернет-соединения', 40, 100),
('Перенос тяжелых предметов', 'Услуги грузчика', 100, 200)

INSERT Payments(id_work, id_worker, countOf, dateOf, taxes, taxExemption)
VALUES
(1, 1, 4, '2019-10-10', 0, 'Малообеспеченность'),
(1, 2, 5, '2019-09-10', 10, NULL),
(2, 3, 10, '2019-11-10', 5, NULL),
(2, 4, 8, '2019-10-12', 10, NULL),
(3, 5, 20, '2019-09-11', 0, 'Многодетность'),
(3, 6, 15, '2019-08-10', 5, NULL),
(4, 7, 1, '2019-07-11', 10, NULL),
(4, 8, 2, '2019-10-5', 5, NULL),
(5, 9, 1, '2019-09-20', 3, NULL),
(5, 10, 1, '2019-08-07', 5, NULL),
(6, 1, 2, '2019-10-12', 0, 'Малообеспеченность'),
(6, 2, 1, '2019-11-11', 10, NULL),
(7, 3, 3, '2019-08-22', 5, NULL),
(7, 4, 2, '2019-09-22', 5, NULL),
(8, 5, 4, '2019-11-13', 0, 'Многодетность'),
(8, 6, 5, '2019-11-12', 6, NULL),
(9, 7, 1, '2019-07-10', 10, NULL),
(9, 8, 2, '2019-10-12', 5, NULL),
(10, 9, 3, '2019-08-10', 3, NULL),
(10, 10, 4, '2019-09-10', 5, NULL),
(4, 10, 1, '2019-07-07', 5, NULL),
(1, 10, 4, '2019-08-10', 5, NULL),
(2, 9, 10, '2019-09-10', 5, NULL),
(3, 8, 20, '2019-09-11', 10, NULL),
(4, 7, 1, '2019-08-11', 3, NULL),
(5, 6, 1, '2019-08-20', 3, NULL),
(6, 5, 2, '2019-09-12', 0, 'Многодетность'),
(7, 4, 3, '2019-09-22', 5, NULL),
(8, 3, 4, '2019-11-13', 10, NULL),
(9, 2, 1, '2019-11-10', 10, NULL),
(10, 1, 3, '2019-10-08', 0, 'Малообеспеченность')




И задание - создать хранимые процедуры (или хотя бы запросы):
1. В каждом месяце (MONTH(Payments.dateOf)) определить виды работ (Works.typeOf) с наименьшими выплатами, где выплата рассчитывается исходя из стажа по данному принципу
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CASE
	WHEN (DATEDIFF(NOW(), Workers.employmentDate) < 365) THEN
		Payments.countOf * Works.lowerLimitOfPayment
	WHEN (DATEDIFF(NOW(), Workers.employmentDate) BETWEEN 365 AND 1825) THEN
		Payments.countOf * ((Works.lowerLimitOfPayment + Works.upperLimitOfPayment)/2)
	WHEN (DATEDIFF(NOW(), Workers.employmentDate) > 1825) THEN
		Payments.countOf * Works.upperLimitOfPayment
	END


2. Определить сотрудников с наименьшим стажем (Workers.employmentDate) по каждому виду работ (Works.typeOf)

Написал данные запросы:
1.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT MONTH(payments.dateOf), MIN(CASE
	WHEN (DATEDIFF(NOW(), Workers.employmentDate) < 365) THEN
		Payments.countOf * Works.lowerLimitOfPayment
	WHEN (DATEDIFF(NOW(), Workers.employmentDate) BETWEEN 365 AND 1825) THEN
		Payments.countOf * ((Works.lowerLimitOfPayment + Works.upperLimitOfPayment)/2)
	WHEN (DATEDIFF(NOW(), Workers.employmentDate) > 1825) THEN
		Payments.countOf * Works.upperLimitOfPayment
	END), works.typeOf 
FROM Payments
JOIN Works ON Works.Id = Payments.id_work
JOIN Workers ON Workers.Id = Payments.id_worker
GROUP BY MONTH(Payments.dateOf)
order by MONTH(Payments.dateOf)



Выводит:
7 25.0000 Сборка стола
8 10.0000 Кошение травы
9 30.0000 Кошение травы
10 150.0000 Кошение травы
11 70.0000 Выкапывание картофеля

Должен:

7 25.0000 Сборка стола
8 10.0000 Сборка стула
9 30.0000 Сборка стула
10 150.0000 Полив цветов
11 70.0000 Подключение услуги интернет

2.

Код: sql
1.
2.
3.
4.
5.
SELECT MAX(workers.employmentDate), workers.fio, works.typeOf
FROM Payments
JOIN Works ON Works.Id = Payments.id_work
JOIN Workers ON Workers.Id = Payments.id_worker
group by works.typeOf




Тут проблема с выводом ФИО сотрудников. То есть самый маленький стаж по каждой работе выводит правильно, но ФИО сотрудника с данной датой устройства на работу выдает неправильно.

Прошу помочь с исправлением запросов.
...
Рейтинг: 0 / 0
Неправильный вывод соответствующих строк. Ошибки в построении запросов.
    #39903439
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SentinOS,

Запрос неверный, выделил лишнее поле в SELECT-LIST.

SELECT MAX(workers.employmentDate), workers.fio , works.typeOf
FROM Payments
JOIN Works ON Works.Id = Payments.id_work
JOIN Workers ON Workers.Id = Payments.id_worker
group by works.typeOf

Поля в SELECT-LIST в запросе с GROUP BY должны быть либо под агрегатными функциями, либо должны быть включены в
GROUP BY
...
Рейтинг: 0 / 0
Неправильный вывод соответствующих строк. Ошибки в построении запросов.
    #39903443
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SentinOS

2. Определить сотрудников с наименьшим стажем (Workers.employmentDate) по каждому виду работ (Works.typeOf)

Код: sql
1.
2.
3.
4.
5.
SELECT MAX(workers.employmentDate), workers.fio, works.typeOf
FROM Payments
JOIN Works ON Works.Id = Payments.id_work
JOIN Workers ON Workers.Id = Payments.id_worker
group by works.typeOf





Запрос даже близко не делает то, что должен делать.

Запрос надо строить по такой схеме:

0) определить по каждому виду работ наименьший стаж
1) выбрать из БД всех сотрудников, у которых стаж по данному виду работ совпадает с наименьшим.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Неправильный вывод соответствующих строк. Ошибки в построении запросов.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]