Загрузка данных
-- ============================================================
-- ER-ДИАГРАММА: УЧЁТ ВЫПУСКА ПРОДУКЦИИ НА УЧАСТКЕ МОНТАЖА ПЛАТ
-- СУБД: PostgreSQL
-- ============================================================
-- ------------------------------------------------------------
-- УДАЛЕНИЕ СТАРЫХ ТАБЛИЦ (если есть)
-- ------------------------------------------------------------
DROP TABLE IF EXISTS Выпуск_продукции CASCADE;
DROP TABLE IF EXISTS Партия CASCADE;
DROP TABLE IF EXISTS Сотрудник CASCADE;
DROP TABLE IF EXISTS Продукция CASCADE;
DROP TABLE IF EXISTS Участок CASCADE;
-- ============================================================
-- БЛОК 1. СОЗДАНИЕ ТАБЛИЦ (без связей)
-- ============================================================
-- 1.1. Участок
CREATE TABLE Участок (
id_участка SERIAL PRIMARY KEY,
наименование VARCHAR(100) NOT NULL,
руководитель VARCHAR(150),
смена VARCHAR(20)
);
-- 1.2. Продукция
CREATE TABLE Продукция (
id_продукции SERIAL PRIMARY KEY,
наименование VARCHAR(150) NOT NULL,
артикул VARCHAR(50) UNIQUE,
тип_платы VARCHAR(100),
норма_времени DECIMAL(6,2)
);
-- 1.3. Сотрудник
CREATE TABLE Сотрудник (
id_сотрудника SERIAL PRIMARY KEY,
ФИО VARCHAR(150) NOT NULL,
табельный_номер VARCHAR(20) UNIQUE,
разряд INT,
id_участка INT
);
-- 1.4. Партия
CREATE TABLE Партия (
id_партии SERIAL PRIMARY KEY,
номер_партии VARCHAR(50) UNIQUE,
дата_запуска DATE,
id_продукции INT,
план_количество INT,
факт_количество INT
);
-- 1.5. Выпуск_продукции
CREATE TABLE Выпуск_продукции (
id_выпуска SERIAL PRIMARY KEY,
id_продукции INT,
id_сотрудника INT,
id_партии INT,
дата DATE NOT NULL,
количество INT NOT NULL,
брак INT DEFAULT 0,
статус VARCHAR(20) DEFAULT 'принято'
);
-- ============================================================
-- БЛОК 2. СВЯЗИ (внешние ключи)
-- ============================================================
-- Связь 1. Сотрудник → Участок
-- (на участке работает много сотрудников)
ALTER TABLE Сотрудник
ADD CONSTRAINT fk_сотрудник_участок
FOREIGN KEY (id_участка) REFERENCES Участок(id_участка);
-- Связь 2. Партия → Продукция
-- (партия формируется под конкретное изделие)
ALTER TABLE Партия
ADD CONSTRAINT fk_партия_продукция
FOREIGN KEY (id_продукции) REFERENCES Продукция(id_продукции);
-- Связь 3. Выпуск_продукции → Продукция
-- (что выпущено)
ALTER TABLE Выпуск_продукции
ADD CONSTRAINT fk_выпуск_продукция
FOREIGN KEY (id_продукции) REFERENCES Продукция(id_продукции);
-- Связь 4. Выпуск_продукции → Сотрудник
-- (кто выпустил)
ALTER TABLE Выпуск_продукции
ADD CONSTRAINT fk_выпуск_сотрудник
FOREIGN KEY (id_сотрудника) REFERENCES Сотрудник(id_сотрудника);
-- Связь 5. Выпуск_продукции → Партия
-- (из какой партии)
ALTER TABLE Выпуск_продукции
ADD CONSTRAINT fk_выпуск_партия
FOREIGN KEY (id_партии) REFERENCES Партия(id_партии);
-- ============================================================
-- БЛОК 3. ЗАПОЛНЕНИЕ ДАННЫМИ (по 5 записей)
-- ============================================================
-- 3.1. Участок (5 записей)
INSERT INTO Участок (наименование, руководитель, смена) VALUES
('Участок монтажа №1', 'Иванов И.И.', 'Первая'),
('Участок монтажа №2', 'Петров П.П.', 'Вторая'),
('Участок пайки SMD', 'Сидоров С.С.', 'Первая'),
('Участок выходного контроля', 'Кузнецова А.А.', 'Вторая'),
('Участок сборки изделий', 'Морозов М.М.', 'Третья');
-- 3.2. Продукция (5 записей)
INSERT INTO Продукция (наименование, артикул, тип_платы, норма_времени) VALUES
('Контроллер управления', 'CTRL-001', 'Двухсторонняя', 45.50),
('Плата питания', 'PWR-002', 'Однослойная', 30.00),
('Модуль связи', 'COM-003', 'Многослойная', 60.25),
('Датчик температуры', 'TEMP-004', 'Однослойная', 25.00),
('Блок индикации', 'IND-005', 'Двухсторонняя', 40.00);
-- 3.3. Сотрудник (5 записей)
INSERT INTO Сотрудник (ФИО, табельный_номер, разряд, id_участка) VALUES
('Алексеев Алексей Алексеевич', 'T-1001', 3, 1),
('Борисова Бэла Борисовна', 'T-1002', 4, 2),
('Волков Виктор Викторович', 'T-1003', 5, 3),
('Громова Галина Григорьевна', 'T-1004', 2, 4),
('Дмитриев Дмитрий Дмитриевич', 'T-1005', 4, 5);
-- 3.4. Партия (5 записей)
INSERT INTO Партия (номер_партии, дата_запуска, id_продукции, план_количество, факт_количество) VALUES
('P-2024-001', '2024-01-10', 1, 100, 98),
('P-2024-002', '2024-01-15', 2, 200, 195),
('P-2024-003', '2024-01-20', 3, 150, 150),
('P-2024-004', '2024-02-01', 4, 300, 290),
('P-2024-005', '2024-02-10', 5, 120, 118);
-- 3.5. Выпуск_продукции (5 записей)
INSERT INTO Выпуск_продукции (id_продукции, id_сотрудника, id_партии, дата, количество, брак, статус) VALUES
(1, 1, 1, '2024-01-12', 50, 2, 'принято'),
(2, 2, 2, '2024-01-17', 100, 5, 'принято'),
(3, 3, 3, '2024-01-22', 75, 0, 'принято'),
(4, 4, 4, '2024-02-03', 150, 10, 'отклонено'),
(5, 5, 5, '2024-02-12', 60, 2, 'принято');
-- ============================================================
-- БЛОК 4. ПРОВЕРКА СВЯЗЕЙ
-- ============================================================
-- 4.1. Посмотреть все внешние ключи в базе
SELECT
tc.table_name AS таблица,
kcu.column_name AS колонка,
ccu.table_name AS связана_с_таблицей,
ccu.column_name AS связана_с_колонкой
FROM information_schema.table_constraints AS tc
JOIN information_schema.key_column_usage AS kcu
ON tc.constraint_name = kcu.constraint_name
JOIN information_schema.constraint_column_usage AS ccu
ON ccu.constraint_name = tc.constraint_name
WHERE tc.constraint_type = 'FOREIGN KEY'
ORDER BY tc.table_name;
-- ============================================================
-- БЛОК 5. АНАЛИТИЧЕСКИЕ ЗАПРОСЫ
-- ============================================================
-- 5.1. Все записи выпуска с расшифровкой
SELECT
в.id_выпуска,
п.наименование AS изделие,
п.артикул,
с.ФИО AS сотрудник,
у.наименование AS участок,
па.номер_партии,
в.дата,
в.количество,
в.брак,
в.статус
FROM Выпуск_продукции в
JOIN Продукция п ON п.id_продукции = в.id_продукции
JOIN Сотрудник с ON с.id_сотрудника = в.id_сотрудника
JOIN Участок у ON у.id_участка = с.id_участка
JOIN Партия па ON па.id_партии = в.id_партии
ORDER BY в.дата;
-- 5.2. Итоги по участкам
SELECT
у.наименование AS участок,
SUM(в.количество) AS всего_выпущено,
SUM(в.брак) AS всего_брака,
ROUND(100.0 * SUM(в.брак) / NULLIF(SUM(в.количество), 0), 2) AS процент_брака
FROM Выпуск_продукции в
JOIN Сотрудник с ON с.id_сотрудника = в.id_сотрудника
JOIN Участок у ON у.id_участка = с.id_участка
GROUP BY у.наименование
ORDER BY процент_брака DESC;
-- 5.3. Выполнение плана по партиям
SELECT
па.номер_партии,
п.наименование AS изделие,
па.план_количество,
па.факт_количество,
ROUND(100.0 * па.факт_количество / NULLIF(па.план_количество, 0), 2) AS процент_выполнения
FROM Партия па
JOIN Продукция п ON п.id_продукции = па.id_продукции
ORDER BY па.дата_запуска;
-- 5.4. Выработка по сотрудникам
SELECT
с.ФИО,
с.табельный_номер,
у.наименование AS участок,
SUM(в.количество) AS всего_выпущено,
SUM(в.брак) AS брак
FROM Выпуск_продукции в
JOIN Сотрудник с ON с.id_сотрудника = в.id_сотрудника
JOIN Участок у ON у.id_участка = с.id_участка
GROUP BY с.ФИО, с.табельный_номер, у.наименование
ORDER BY всего_выпущено DESC;
-- ============================================================
-- КОНЕЦ СКРИПТА
-- ============================================================