CREATE DATABASE HospitalGeneral;
GO
USE HospitalGeneral;
CREATE TABLE Floor (
floor_number INT PRIMARY KEY,
floor_name VARCHAR(255),
number_of_beds INT
);
CREATE TABLE Bed (
bed_number INT,
floor_number INT,
PRIMARY KEY (bed_number, floor_number),
FOREIGN KEY (floor_number) REFERENCES Floor(floor_number)
);
CREATE TABLE Patient (
patient_id INT PRIMARY KEY,
first_name VARCHAR(255),
last_name VARCHAR(255),
birth_date DATE
);
CREATE TABLE VisitingCard (
card_id INT PRIMARY KEY,
patient_id INT,
start_time TIME,
end_time TIME,
FOREIGN KEY (patient_id) REFERENCES Patient(patient_id)
);
CREATE TABLE Speciality (
speciality_id INT PRIMARY KEY,
speciality_description VARCHAR(255)
);
CREATE TABLE Doctor (
doctor_id INT PRIMARY KEY,
Dr_first_name VARCHAR(255),
Dr_last_name VARCHAR(255),
speciality_id INT,
FOREIGN KEY (speciality_id) REFERENCES Speciality(speciality_id)
);
CREATE TABLE Diagnosis (
diagnosis_id INT PRIMARY KEY,
diagnosis_description VARCHAR(255)
);
CREATE TABLE MedicalVisit (
MedicalVisit_id INT PRIMARY KEY,
patient_id INT,
doctor_id INT,
visit_date DATE,
visit_time TIME,
FOREIGN KEY (patient_id) REFERENCES Patient(patient_id),
FOREIGN KEY (doctor_id) REFERENCES Doctor(doctor_id)
);
CREATE TABLE PatientDiagnosis (
PatientDiagnosis_id INT PRIMARY KEY,
patient_id INT,
diagnosis_id INT,
diagnosis_date DATE,
FOREIGN KEY (patient_id) REFERENCES Patient(patient_id),
FOREIGN KEY (diagnosis_id) REFERENCES Diagnosis(diagnosis_id)
);
INSERT INTO Floor (floor_number, floor_name, number_of_beds) VALUES
(1, 'Cardiología', 30),
(2, 'Oncología', 25),
(3, 'Pediatría', 40),
(4, 'Urgencias', 15),
(5, 'Cuidados Intensivos', 10);
INSERT INTO Bed (bed_number, floor_number) VALUES
(1, 1), (2, 1), (3, 1), (4, 1), (5, 1),
(1, 2), (2, 2), (3, 2), (4, 2), (5, 2),
(1, 3), (2, 3), (3, 3), (4, 3), (5, 3),
(1, 4), (2, 4), (3, 4), (4, 4), (5, 4),
(1, 5), (2, 5), (3, 5), (4, 5), (5, 5);
INSERT INTO Patient (patient_id, first_name, last_name, birth_date) VALUES
(1, 'Juan', 'Pérez', '1980-05-10'),
(2, 'María', 'García', '1975-09-22'),
(3, 'Pedro', 'Rodríguez', '1992-02-15'),
(4, 'Ana', 'Martínez', '1968-11-08'),
(5, 'Luis', 'Sánchez', '2000-07-03');
INSERT INTO VisitingCard (card_id, patient_id, start_time, end_time) VALUES
(1, 1, '09:00:00', '11:00:00'),
(2, 2, '10:00:00', '12:00:00'),
(3, 3, '14:00:00', '16:00:00'),
(4, 4, '15:00:00', '17:00:00'),
(5, 5, '16:00:00', '18:00:00');
INSERT INTO Speciality (speciality_id, speciality_description) VALUES
(1, 'Cardiología'),
(2, 'Oncología'),
(3, 'Pediatría'),
(4, 'Neurología'),
(5, 'Traumatología');
INSERT INTO Doctor (doctor_id, Dr_first_name, Dr_last_name, speciality_id) VALUES
(1, 'Carlos', 'Gómez', 1),
(2, 'Laura', 'Fernández', 2),
(3, 'Miguel', 'Díaz', 3),
(4, 'Sofía', 'Moreno', 4),
(5, 'Javier', 'Blanco', 5);
INSERT INTO Diagnosis (diagnosis_id, diagnosis_description) VALUES
(1, 'Infarto de miocardio'),
(2, 'Neumonía'),
(3, 'Fractura de fémur'),
(4, 'Migraña'),
(5, 'Diabetes tipo 2');
INSERT INTO MedicalVisit (MedicalVisit_id, patient_id, doctor_id, visit_date,
visit_time) VALUES
(1, 1, 1, '2024-10-22', '10:00:00'),
(2, 2, 2, '2024-10-22', '11:00:00'),
(3, 3, 3, '2024-10-22', '14:00:00'),
(4, 4, 4, '2024-10-21', '15:00:00'),
(5, 5, 5, '2024-10-21', '16:00:00'),
(6, 1, 2, '2024-10-20', '09:00:00'),
(7, 2, 3, '2024-10-20', '10:30:00'),
(8, 3, 1, '2024-10-19', '11:15:00'),
(9, 4, 5, '2024-10-19', '14:45:00'),
(10, 5, 4, '2024-10-18', '16:30:00'),
(11, 1, 3, '2024-10-18', '08:45:00'),
(12, 2, 1, '2024-10-17', '10:15:00'),
(13, 3, 5, '2024-10-17', '11:30:00'),
(14, 4, 2, '2024-10-16', '14:00:00'),
(15, 5, 1, '2024-10-16', '15:45:00'),
(16, 1, 4, '2024-10-15', '09:30:00'),
(17, 2, 5, '2024-10-15', '11:00:00'),
(18, 3, 2, '2024-10-14', '12:15:00'),
(19, 4, 1, '2024-10-14', '15:30:00'),
(20, 5, 3, '2024-10-13', '17:00:00');
INSERT INTO PatientDiagnosis (PatientDiagnosis_id, patient_id, diagnosis_id,
diagnosis_date) VALUES
(1, 1, 1, '2024-10-22'),
(2, 2, 2, '2024-10-22'),
(3, 3, 3, '2024-10-21'),
(4, 4, 4, '2024-10-21'),
(5, 5, 5, '2024-10-20'),
(6, 1, 2, '2024-10-20'),
(7, 2, 3, '2024-10-19'),
(8, 3, 1, '2024-10-19'),
(9, 4, 5, '2024-10-18'),
(10, 5, 4, '2024-10-18'),
(11, 1, 3, '2024-10-17'),
(12, 2, 1, '2024-10-17'),
(13, 3, 5, '2024-10-16'),
(14, 4, 2, '2024-10-16'),
(15, 5, 1, '2024-10-15'),
(16, 1, 4, '2024-10-15'),
(17, 2, 5, '2024-10-14'),
(18, 3, 2, '2024-10-14'),
(19, 4, 1, '2024-10-13'),
(20, 5, 3, '2024-10-13');
-- Consultas WHERE
-- 1. Mostrar los pacientes que fueron atendidos por el doctor con id 1
SELECT Patient.first_name, Patient.last_name, Doctor.doctor_id,
Doctor.Dr_first_name, Doctor.Dr_last_name
FROM Patient
INNER JOIN MedicalVisit ON Patient.patient_id = MedicalVisit.patient_id
INNER JOIN Doctor ON MedicalVisit.doctor_id = Doctor.doctor_id
WHERE MedicalVisit.doctor_id = 1;
-- 2. Mostrar las visitas médicas realizadas en la fecha '2024-10-22'
SELECT Patient.first_name, Patient.last_name, Doctor.Dr_first_name,
Doctor.Dr_last_name, MedicalVisit.visit_date
FROM MedicalVisit
INNER JOIN Patient ON MedicalVisit.patient_id = Patient.patient_id
INNER JOIN Doctor ON MedicalVisit.doctor_id = Doctor.doctor_id
WHERE MedicalVisit.visit_date = '2024-10-22';
-- 3. Mostrar los pacientes que tienen un diagnóstico con id 1
SELECT Patient.first_name, Patient.last_name, PatientDiagnosis.diagnosis_id,
Diagnosis.diagnosis_description
FROM Patient
INNER JOIN PatientDiagnosis ON Patient.patient_id = PatientDiagnosis.patient_id
INNER JOIN Diagnosis on PatientDiagnosis.diagnosis_id = Diagnosis.diagnosis_id
WHERE PatientDiagnosis.diagnosis_id = 1;
-- 4. Mostrar los médicos que tienen la especialidad con id 2
SELECT Doctor.Dr_first_name, Doctor.Dr_last_name, Doctor.speciality_id,
Speciality.speciality_description
FROM Doctor
INNER JOIN Speciality ON Doctor.speciality_id = Speciality.speciality_id
WHERE Doctor.speciality_id = 2;
-- 5. Mostrar los pacientes que nacieron después de '1990-01-01'
SELECT *
FROM Patient
WHERE Patient.birth_date > '1990-01-01';
-- 6. Mostrar las tarjetas de visita que comienzan después de las '15:00:00'
SELECT *
FROM VisitingCard
WHERE VisitingCard.start_time > '15:00:00';
-- 7. Mostrar los pacientes que tienen un diagnóstico con id 2 y fueron atendidos
por el doctor con id 3
SELECT Patient.first_name, Patient.last_name, PatientDiagnosis.diagnosis_id,
Diagnosis.diagnosis_description, Doctor.doctor_id, Doctor.Dr_first_name,
Doctor.Dr_last_name
FROM Patient
INNER JOIN PatientDiagnosis ON Patient.patient_id = PatientDiagnosis.patient_id
INNER JOIN MedicalVisit ON Patient.patient_id = MedicalVisit.patient_id
INNER JOIN Doctor on MedicalVisit.doctor_id = Doctor.doctor_id
INNER JOIN Diagnosis ON PatientDiagnosis.diagnosis_id = Diagnosis.diagnosis_id
WHERE PatientDiagnosis.diagnosis_id = 2 AND MedicalVisit.doctor_id = 3;
-- 8. Mostrar las visitas médicas que se realizaron entre las '10:00:00' y las
'12:00:00'
SELECT MedicalVisit.visit_date, MedicalVisit.visit_time, Patient.patient_id,
Patient.first_name, Patient.last_name, Doctor.doctor_id, Doctor.Dr_first_name,
Doctor.Dr_last_name, Speciality.speciality_description
FROM MedicalVisit
INNER JOIN Patient ON MedicalVisit.patient_id = Patient.patient_id
INNER JOIN Doctor ON MedicalVisit.doctor_id = Doctor.doctor_id
INNER JOIN Speciality ON Doctor.speciality_id = Speciality.speciality_id
WHERE MedicalVisit.visit_time BETWEEN '10:00:00' AND '12:00:00';
-- 09. Mostrar las visitas médicas que no se realizaron en la fecha '2024-10-22'
SELECT MedicalVisit.visit_date, MedicalVisit.visit_time, Patient.patient_id,
Patient.first_name, Patient.last_name, Doctor.doctor_id, Doctor.Dr_first_name,
Doctor.Dr_last_name, Speciality.speciality_description
FROM MedicalVisit
INNER JOIN Patient ON MedicalVisit.patient_id = Patient.patient_id
INNER JOIN Doctor ON MedicalVisit.doctor_id = Doctor.doctor_id
INNER JOIN Speciality ON Doctor.speciality_id = Speciality.speciality_id
WHERE MedicalVisit.visit_date != '2024-10-22';
-- 10. Mostrar los pacientes que tienen un diagnóstico con id 1 o id 3
SELECT Patient.first_name, Patient.last_name, Diagnosis.diagnosis_id,
Diagnosis.diagnosis_description
FROM Patient
INNER JOIN PatientDiagnosis ON Patient.patient_id = PatientDiagnosis.patient_id
INNER JOIN Diagnosis ON PatientDiagnosis.diagnosis_id = Diagnosis. diagnosis_id
WHERE PatientDiagnosis.diagnosis_id = 1 OR PatientDiagnosis.diagnosis_id = 3;
-- 11. Mostrar los médicos que tienen una especialidad con id 1
SELECT *
FROM Doctor
INNER JOIN Speciality ON Doctor.speciality_id = Speciality.speciality_id
WHERE Doctor.speciality_id = 1 ;
-- 12. Mostrar los pacientes que fueron atendidos por el doctor con id 2 en la
fecha '2024-10-22'
SELECT MedicalVisit.visit_date, Patient.first_name, Patient.last_name,
Doctor.Dr_last_name, Doctor.Dr_last_name
FROM Patient
INNER JOIN MedicalVisit ON Patient.patient_id = MedicalVisit.patient_id
INNER JOIN Doctor ON MedicalVisit.doctor_id = Doctor.doctor_id
WHERE MedicalVisit.doctor_id = 2 AND MedicalVisit.visit_date = '2024-10-22';
-- 13. Mostrar los pacientes que tienen un diagnóstico con id 4 y nacieron antes de
'1990-01-01'
SELECT Patient.first_name, Patient.last_name, Patient.birth_date,
Diagnosis.diagnosis_id, Diagnosis.diagnosis_description
FROM Patient
INNER JOIN PatientDiagnosis ON Patient.patient_id = PatientDiagnosis.patient_id
INNER JOIN Diagnosis ON PatientDiagnosis.diagnosis_id = Diagnosis.diagnosis_id
WHERE PatientDiagnosis.diagnosis_id = 4 AND Patient.birth_date < '1990-01-01';
-- 14. Mostrar los médicos que no tienen una especialidad con id 3
SELECT *
FROM Doctor
INNER JOIN Speciality ON Doctor.speciality_id = Speciality.speciality_id
WHERE Doctor.speciality_id != 3;
-- 15. Mostrar los pacientes que fueron atendidos por el doctor con id 1 o id 3 en
la fecha '2024-10-22' o '2024-10-21'
SELECT MedicalVisit.visit_date, Patient.first_name, Patient.last_name,
Doctor.doctor_id, Doctor.Dr_first_name, Doctor.Dr_last_name,
Speciality.speciality_description
FROM Patient
INNER JOIN MedicalVisit ON Patient.patient_id = MedicalVisit.patient_id
INNER JOIN Doctor ON MedicalVisit.doctor_id = Doctor.doctor_id
INNER JOIN Speciality ON Doctor.speciality_id = Speciality.speciality_id
WHERE (MedicalVisit.doctor_id = 1 OR MedicalVisit.doctor_id = 3) AND
(MedicalVisit.visit_date = '2024-10-22' OR MedicalVisit.visit_date = '2024-10-21');
-- Consultas de agrupamiento
-- 1. Contar el número de pacientes por cada planta
SELECT Floor.floor_name, COUNT(Patient.patient_id) AS num_pacientes
FROM Floor
INNER JOIN Bed ON Floor.floor_number = Bed.floor_number
INNER JOIN Patient ON Bed.bed_number = Patient.patient_id
GROUP BY Floor.floor_name;
-- 2. Mostrar el número de visitas médicas por cada doctor
SELECT Doctor.Dr_first_name, Doctor.Dr_last_name,
COUNT(MedicalVisit.MedicalVisit_id) AS num_visitas
FROM Doctor
INNER JOIN MedicalVisit ON Doctor.doctor_id = MedicalVisit.doctor_id
GROUP BY Doctor.Dr_first_name, Doctor.Dr_last_name;
-- 3. Encontrar la fecha de la última visita médica por cada paciente
SELECT Patient.first_name, Patient.last_name, MAX(MedicalVisit.visit_date) AS
ultima_visita
FROM Patient
INNER JOIN MedicalVisit ON Patient.patient_id = MedicalVisit.patient_id
GROUP BY Patient.first_name, Patient.last_name;
-- 4. Contar el número de pacientes por cada especialidad médica
SELECT Speciality.speciality_description, COUNT(Patient.patient_id) AS
num_pacientes
FROM Speciality
INNER JOIN Doctor ON Speciality.speciality_id = Doctor.speciality_id
INNER JOIN MedicalVisit ON Doctor.doctor_id = MedicalVisit.doctor_id
INNER JOIN Patient ON MedicalVisit.patient_id = Patient.patient_id
GROUP BY Speciality.speciality_description;
-- 5. Calcular el número promedio de diagnósticos por paciente
SELECT AVG(num_diagnosticos) AS promedio_diagnosticos_por_paciente
FROM (SELECT COUNT(diagnosis_id) AS num_diagnosticos
FROM PatientDiagnosis
GROUP BY patient_id) AS diagnosticos_por_paciente;