Напредни извештаи од базата (SQL и складирани процедури)
Проценка на присуство за одреден студент
Прво креираме табела каде што ќе ги чуваме податоците од повикување на процедурата
CREATE TABLE Attendance_Report ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), student_id UUID NOT NULL, start_date DATE NOT NULL, end_date DATE NOT NULL, present_count INTEGER NOT NULL, absent_count INTEGER NOT NULL, late_count INTEGER NOT NULL, attendance_status VARCHAR(30) NOT NULL, generated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (student_id) REFERENCES Ucenik(id) );
Следно креираме процедура за броење на
- бројот на "ZADOCNET"
- бројот на "PRISUTEN"
- бројот на "OTSUTEN"
И потоа пресметуваме според одредена логика за просечна вредност која што може да биде
- REDOVEN
- POVREMENO_OTSUTEN
- NEREDOVEN
CREATE OR REPLACE PROCEDURE generate_attendance_report(
p_start_date DATE,
p_end_date DATE
)
LANGUAGE plpgsql
AS $$
DECLARE
r RECORD;
v_status VARCHAR(30);
BEGIN
DELETE FROM Attendance_Report -- go briseme prethodniot zapis
WHERE start_date = p_start_date
AND end_date = p_end_date;
FOR r IN
SELECT
p.seOdnesuvaNaUcenikot_Id AS student_id,
COUNT(*) FILTER (
WHERE p.status = 'PRISUTEN'
)::INTEGER AS present_count,
COUNT(*) FILTER (
WHERE p.status = 'OTSUTEN'
)::INTEGER AS absent_count,
COUNT(*) FILTER (
WHERE p.status = 'ZADOCNET'
)::INTEGER AS late_count
FROM Prisustvo p
WHERE p.datum BETWEEN p_start_date AND p_end_date
GROUP BY p.seOdnesuvaNaUcenikot_Id
LOOP
IF r.absent_count = 0
AND r.late_count <= 2 THEN
v_status := 'REDOVEN';
ELSIF r.absent_count <= 3
AND r.late_count <= 5 THEN
v_status := 'POVREMENO_OTSUTEN';
ELSE
v_status := 'NEREDOVEN';
END IF;
INSERT INTO Attendance_Report (
student_id,
start_date,
end_date,
present_count,
absent_count,
late_count,
attendance_status
)
VALUES (
r.student_id,
p_start_date,
p_end_date,
r.present_count,
r.absent_count,
r.late_count,
v_status
);
END LOOP;
END;
$$;
Откако ќе се внесат неколку присуства, може да ја повикаме процедурата:
CALL generate_attendance_report( '2026-01-01', '2026-12-31' ); --datum od, datum do odnosno cela godina
Потоа може Direktor_Admin да кликне на статистика" од Navbar и да ги извлече резултатите со следниов SQL:
SELECT
student_id,
start_date,
end_date,
present_count,
absent_count,
late_count,
attendance_status,
generated_at,
k.ime,
k.prezime
FROM Attendance_Report
JOIN Korisnik k ON k.id = student_id
ORDER BY attendance_status, student_id
Last modified
11 days ago
Last modified on 09/15/26 17:10:44
Attachments (1)
- procedure.jpg (122.1 KB ) - added by 11 days ago.
Download all attachments as: .zip
Note:
See TracWiki
for help on using the wiki.

