DAM - DAW - MP 0484 Bases de Dades
Pràctica 8: - Base de dades hospital. Consultes d'Agrupament
-
Obté el salari mig de tots els empleats Interns de la plantilla de l'hospital.
+---------------+ | Sou Mig | +---------------+ | 259966.666667 | +---------------+Possible solució
SELECT AVG(plantilla_salari) AS "Sou Mig" FROM plantilla WHERE plantilla_funcio = 'Intern'; -
Obté el salari més alt i el salari més baix de la plantilla i la diferencia entre aquests valors.
+-----------+-----------+------------+ | Màxim | Mínim | Diferència | +-----------+-----------+------------+ | 337900.00 | 162600.00 | 175300.00 | +-----------+-----------+------------+Possible solució
SELECT MAX(plantilla_salari) AS "Màxim", MIN(plantilla_salari) AS "Mínim", MAX(plantilla_salari) - MIN(plantilla_salari) AS "Diferència" FROM plantilla; -
Obté el número de funcions diferents que realitzen els empleats de la plantilla que tenen codi d'hospital 22.
+-------------+ | NumFuncions | +-------------+ | 3 | +-------------+Possible solució
SELECT COUNT(DISTINCT plantilla_funcio) AS "NumFuncions" FROM plantilla WHERE plantilla_hospital_codi = 22; -
Busca quins torns de la plantilla de l'hospital tenen més de 2 persones.
+----------------+-------+ | plantilla_torn | Total | +----------------+-------+ | T | 6 | +----------------+-------+Possible solució
SELECT plantilla_torn, COUNT(*) "Total" FROM plantilla GROUP BY plantilla_torn HAVING COUNT(*) > 2; -
Calcula l'edat mitjana dels malalts.
+---------+ | Mitjana | +---------+ | 66.2000 | +---------+Possible solució
SELECT AVG(TIMESTAMPDIFF(YEAR, malalt_dnaixa, CURRENT_DATE)) "Mitjana" FROM malalt; -
Calcula el nombre de treballadors i sou mig de la plantilla de cada sala de cada hospital.
+-------------------------+---------------------+--------+---------------+ | plantilla_hospital_codi | plantilla_sala_codi | Quants | Mitjana Sou | +-------------------------+---------------------+--------+---------------+ | 13 | 6 | 2 | 250600.000000 | | 18 | 4 | 1 | 337900.000000 | | 22 | 1 | 2 | 192250.000000 | | 22 | 2 | 1 | 221000.000000 | | 22 | 6 | 2 | 192150.000000 | | 45 | 1 | 1 | 252200.000000 | | 45 | 4 | 1 | 221000.000000 | +-------------------------+---------------------+--------+---------------+Possible solució
SELECT plantilla_hospital_codi, plantilla_sala_codi, COUNT(*) "Quants", AVG(plantilla_salari) "Mitjana Sou" FROM plantilla GROUP BY plantilla_hospital_codi, plantilla_sala_codi; -
Com pots comprovar que no hi ha malalts amb un número de la SS repetit? Troba la solució.
Possible solució
Trobem si hi ha repetits i quins sónSELECT malalt_nss, COUNT(*) "Repetits" FROM malalt GROUP BY malalt_nss HAVING COUNT(*) > 1;Mirem si hi ha repetitsSELECT COUNT(malalt_nss), COUNT(DISTINCT malalt_nss) FROM malalt;Ens diu si hi ha repetitsSELECT COUNT(malalt_nss) - COUNT(DISTINCT malalt_nss) Repetits FROM malalt; -
Selecciona el nombre d'empleats per sala que hi ha a l'hospital 22, descartant les sales amb menys de 2 empleats.
Possible solució
Distingint per hospitalSELECT plantilla_hospital_codi, plantilla_sala_codi, COUNT(*) "Empleats" FROM plantilla WHERE plantilla_hospital_codi = 22 GROUP BY plantilla_hospital_codi, plantilla_sala_codi HAVING COUNT(*) >= 2;Sense distingir per hospitalSELECT plantilla_sala_codi, COUNT(*) "Empleats" FROM plantilla WHERE plantilla_hospital_codi = 22 GROUP BY plantilla_sala_codi HAVING COUNT(*) >= 2; -
Obté el número total de llits, i la mitja de llits dels hospitals, a partir de la taula
HOSPITAL.+---------------+------------------+ | Llists totals | Mitjana de llits | +---------------+------------------+ | 2746 | 686.5000 | +---------------+------------------+Possible solució
SELECT SUM(hospital_nllits) "Llists totals", AVG(hospital_nllits) "Mitjana de llits" FROM hospital; -
Calcula:
-
la mitja de les comissions dels empleats utilitzant
AVG.Possible solució
SELECT AVG(empl_comissio) Mitjana FROM empl; -
la mitja de les comissions dels empleats utilitzant
SUMiCOUNTPossible solució
SELECT SUM(empl_comissio) / COUNT(*) Mitjana FROM empl;
Perquè han sortit diferents aquests valors?
Possible solució
A l'utilitzar
COUNT(*)comptem les files i no els empleats que sí tenen comissió. Per a donar el mateix resultat hauriem d'haver comptat els camps empl_comissio que no sónNULLde la següent forma:SELECT SUM(empl_comissio) / COUNT(*) Mitjana FROM empl WHERE empl_comissio IS NOT NULL;o millor
SELECT SUM(empl_comissio) / COUNT(empl_comissio) Mitjana FROM empl; -
-
Troba quants malalts de cada sexe tenim als hospitals?
+------+-------+ | Sexe | Total | +------+-------+ | F | 5 | | M | 5 | +------+-------+Possible solució
SELECT malalt_sexe "Sexe", COUNT(*) "Total" FROM malalt GROUP BY malalt_sexe; -
Trobar el total de llits, per tipus de sala disponibles entre tots els hospitals.
+------------------+---------------+ | sala_nom | Suma de Llits | +------------------+---------------+ | Cardiologia | 108 | | Cures Intensives | 31 | | Maternitat | 36 | | Psiquiatric | 185 | | Recuperacio | 23 | +------------------+---------------+Possible solució
SELECT sala_nom, SUM(sala_nllits) "Suma de Llits" FROM sala GROUP BY sala_nom; -
Troba en quins hospitals hi treballen més d'un doctor (i indica'n quants), tenint en compte que no volem que es mostrin ni comptin els doctors amb l'especialitat de neurologia.
+----------+--------+ | Hospital | Quants | +----------+--------+ | 13 | 1 | | 18 | 2 | | 22 | 3 | | 45 | 1 | +----------+--------+o millor...
+------------+--------+ | Hospital | Quants | +------------+--------+ | Provincial | 1 | | General | 2 | | La Paz | 3 | | San Carlos | 1 | +------------+--------+Possible solució
SELECT doctor_hospital_codi "Hospital", COUNT(*) "Quants" FROM doctor WHERE doctor_especialitat <> 'Neurologia' GROUP BY doctor_hospital_codi;o bé, afegint el nom de l'hospital
SELECT hospital_nom "Hospital", COUNT(*) "Quants" FROM doctor JOIN hospital ON (doctor_hospital_codi = hospital_codi) WHERE doctor_especialitat <> 'Neurologia' GROUP BY doctor_hospital_codi, hospital_nom; -
Obté, a partir de les sales, els codis dels hospitals que tenen més de 65 llits i indica quants en tenen. Prova d'afegir-hi el nom de l'hospital.
+----------+--------+ | Hospital | Quants | +----------+--------+ | 13 | 88 | | 22 | 162 | | 45 | 70 | +----------+--------+o millor
+------------+--------+ | Hospital | Quants | +------------+--------+ | Provincial | 88 | | La Paz | 162 | | San Carlos | 70 | +------------+--------+Possible solució
SELECT sala_hospital_codi "Hospital", SUM(sala_nllits) "Quants" FROM sala GROUP BY sala_hospital_codi HAVING SUM(sala_nllits) > 65;i també
SELECT hospital_nom "Hospital", SUM(sala_nllits) "Quants" FROM sala JOIN hospital ON (sala_hospital_codi = hospital_codi) GROUP BY sala_hospital_codi, hospital_nom HAVING SUM(sala_nllits) > 65; -
Obté de forma ordenada per sala i torn un llistat del total de personal que hi ha en cada sala, indicant el número de sala, el tipus d'empleat, el torn i el número d'empleats.
+-------------------------+---------------------+------------------+----------------+--------+ | plantilla_hospital_codi | plantilla_sala_codi | plantilla_funcio | plantilla_torn | Quants | +-------------------------+---------------------+------------------+----------------+--------+ | 13 | 6 | Infermer | T | 1 | | 13 | 6 | Infermera | T | 1 | | 18 | 4 | Intern | T | 1 | | 22 | 1 | Infermera | N | 1 | | 22 | 1 | Infermera | T | 1 | | 22 | 2 | Intern | M | 1 | | 22 | 6 | Infermer | M | 1 | | 22 | 6 | Infermera | T | 1 | | 45 | 1 | Infermera | T | 1 | | 45 | 4 | Intern | N | 1 | +-------------------------+---------------------+------------------+----------------+--------+Possible solució
SELECT plantilla_hospital_codi, plantilla_sala_codi, plantilla_funcio, plantilla_torn, COUNT(*) "Quants" FROM plantilla GROUP BY plantilla_hospital_codi, plantilla_sala_codi, plantilla_funcio, plantilla_torn; -
Troba la data de naixement dels pacients més jove i del més vell, per homes i dones.
+-------------+------------+------------+ | malalt_sexe | Més Jove | Més gran | +-------------+------------+------------+ | F | 1980-07-10 | 1940-06-18 | | M | 1980-12-26 | 1942-01-01 | +-------------+------------+------------+Possible solució
SELECT malalt_sexe, MAX(malalt_dnaixa) "Més Jove", MIN(malalt_dnaixa) "Més gran" FROM malalt GROUP BY malalt_sexe; -
Obté els codis d'hospital on hi hagi com a mínim dues persones treballant al torn de tarda.
+----------+--------+ | Hospital | Quants | +----------+--------+ | 13 | 2 | | 22 | 2 | +----------+--------+Possible solució
SELECT plantilla_hospital_codi "Hospital", COUNT(*) "Quants" FROM plantilla WHERE plantilla_torn = 'T' GROUP BY plantilla_hospital_codi HAVING COUNT(*) >= 2; -
Obté els codis d'hospital on hi hagi com a mínim dues persones treballant a la sala núm. 6 i al torn de tarda.
+----------+ | Hospital | +----------+ | 13 | +----------+Possible solució
SELECT plantilla_hospital_codi Hospital FROM plantilla WHERE plantilla_sala_codi = 6 AND plantilla_torn = 'T' GROUP BY plantilla_hospital_codi, plantilla_sala_codi HAVING COUNT(*) >= 2; -
Obté el nombre de llits totals de les sales dels hospitals, mostrant el codi d'hospital i el total de llits. Ordena el resultat de tal manera que l'hospital amb més llits sigui el primer de la llista.
+--------------------+--------------+ | sala_hospital_codi | Llits Totals | +--------------------+--------------+ | 22 | 162 | | 13 | 88 | | 45 | 70 | | 18 | 63 | +--------------------+--------------+Possible solució
SELECT sala_hospital_codi, SUM(sala_nllits) "Llits Totals" FROM sala GROUP BY sala_hospital_codi ORDER BY SUM(sala_nllits) DESC; -
Obté el salari mig (amb euros i dos decimals) de cada departament, però, només tenint en compte el salari dels empleats que van entrar a treballar a l'empresa l'any 1981. Ordena el resultat de menys a més sou.
+---------------+-----------+ | empl_dept_num | Sou mig | +---------------+-----------+ | 30 | 206916.67 | | 20 | 388375.00 | | 10 | 484250.00 | +---------------+-----------+Possible solució
SELECT empl_dept_num, ROUND(AVG(empl_salari), 2) "Sou mig" FROM empl WHERE YEAR(empl_datalt) = 1981 GROUP BY empl_dept_num ORDER BY 2; -
Mostra els codis d'hospital on hi treballen un mínim de dues Infermeres en el torn de tarda.
+----------+----------+ | Hospital | COUNT(*) | +----------+----------+ | 22 | 2 | +----------+----------+Possible solució
SELECT plantilla_hospital_codi "Hospital", COUNT(*) FROM plantilla WHERE plantilla_funcio = 'Infermera' AND plantilla_torn = 'T' GROUP BY plantilla_hospital_codi HAVING COUNT(*) >= 2;