Nhảy đến nội dung chính

ĐỀ TEST SQL – CHỦ ĐỀ: QUẢN LÝ Y TẾ

Thời gian làm bài: 90 phút

🎯 Mục tiêu đánh giá:
- Viết SQL chính xác
- Hiểu nghiệp vụ y tế
- Phát hiện dữ liệu bất thường
- Tư duy kiểm thử dữ liệu


I. MÔ TẢ HỆ THỐNG & CSDL

Giả định DB: MySQL / PostgreSQL

1️⃣ Bảng patients
patients (
                id BIGINT PRIMARY KEY,
                patient_code VARCHAR(20),
                full_name VARCHAR(100),
                gender VARCHAR(10),
                date_of_birth DATE,
                phone VARCHAR(20),
                status VARCHAR(20),
                created_at TIMESTAMP
)


2️⃣ Bảng doctors
doctors (
                id BIGINT PRIMARY KEY,
                doctor_code VARCHAR(20),
                full_name VARCHAR(100),
                specialty VARCHAR(100),
                department VARCHAR(100),
                status VARCHAR(20)
)


3️⃣ Bảng appointments
appointments (
                id BIGINT PRIMARY KEY,
                patient_id BIGINT,
                doctor_id BIGINT,
                appointment_date DATE,
                appointment_time TIME,
                status VARCHAR(20)
)


4️⃣ Bảng medical_records
medical_records (
                id BIGINT PRIMARY KEY,
                patient_id BIGINT,
                doctor_id BIGINT,
                diagnosis TEXT,
                visit_date DATE,
                note TEXT
)


5️⃣ Bảng prescriptions
prescriptions (
                id BIGINT PRIMARY KEY,
                medical_record_id BIGINT,
                medicine_name VARCHAR(100),
                dosage VARCHAR(50),
                days INT
)


II. PHẦN A – SQL CƠ BẢN

⏱ Thời gian gợi ý: 35–40 phút

Câu 1: Danh sách bệnh nhân đang hoạt động
Lấy patient_code, full_name, gender, status của bệnh nhân có status = 'active'.

Câu 2: Lịch hẹn khám và bác sĩ
Liệt kê patient_code, patient_name, doctor_name, specialty, appointment_date, status.

Câu 3: Số lượng bác sĩ theo khoa
Thống kê số lượng bác sĩ theo department.

Câu 4: Lịch sử khám của bệnh nhân
Với patient_code = 'BN001', liệt kê visit_date, doctor_name, diagnosis.

Câu 5: Số lượt khám của mỗi bệnh nhân
Đếm số bản ghi medical_records của từng bệnh nhân.

III. PHẦN B – SQL NÂNG CAO

⏱ Thời gian gợi ý: 50–55 phút

Câu 6: Bệnh nhân chưa từng đi khám
Liệt kê bệnh nhân không có bản ghi trong medical_records.

Câu 7: Bác sĩ có lịch hẹn bị hủy
Liệt kê bác sĩ có ít nhất 1 lịch hẹn status = 'canceled'.

Câu 8: Bác sĩ khám nhiều bệnh nhân nhất
Tìm bác sĩ có số lượt khám nhiều nhất.

Câu 9: Lần khám gần nhất của mỗi bệnh nhân
Lấy patient_code, last_visit_date, doctor_name, diagnosis.

Câu 10: Phát hiện dữ liệu bất thường
Liệt kê appointments có patient_id không tồn tại và prescriptions có medical_record_id không tồn tại.

Câu 11 (Bonus): Tư duy hệ thống
1. Nên index những cột nào?
2. Vì sao không nên lưu tổng số lượt khám trong bảng patients?