Consultas con Agrupamientos en SQL (Structured Query Language)

Anuncio
4. CONSULTAS CON AGRUPAMIENTO DE FILAS.
1. Hallar para cada departamento el salario medio, el mínimo, el máximo y la media aritmética de éstos.
SELECT AVG (SALAR),MIN (SALAR),MAX (SALAR)
FROM TEMPLE
GROUP BY NUMDE
2. Hallar por departamentos la edad en años cumplidos del empleado más viejo del departamento que tiene
comisión. Ordenar el resultado por edades.
SELECT NUMDE,
MAX(CONVERT(INT,(DATEDIFF(DAY,FECNA,GETDATE())/365.25)))
FROM TEMPLE
WHERE COMIS<>0
GROUP BY NUMDE
3. Agrupando por departamento y número de hijos, hallar cuántos empleados hay en cada grupo.
SELECT NUMDE,NUMHI,COUNT (NOMEM) [NUMEROS DE EMPLEADOS]
FROM TEMPLE
GROUP BY NUMDE,NUMHI
ORDER BY NUMDE,NUMHI
4. Hallar el salario máximo y el mínimo para cada grupo de empleados con igual número de hijos y que
tienen al menos uno, y sólo si hay más de un empleado en el grupo y el salario máximo de éste excede a
200000 ptas.
SELECT NUMHI,MAX(SALAR)[SALARIO MAXIMO],MIN(SALAR)[SALARIO MINIMO]
FROM TEMPLE
GROUP BY NUMHI
HAVING NUMHI>=1 AND COUNT(NUMEMP)>1 AND MAX(SALAR)>200
5. Hallar el salario medio por departamento para aquellos departamentos cuyo salario máximo es inferior al
salario medio de todos los empleados.
SELECT NUMDE,AVG(SALAR) AS [SALARIO MEDIO]
FROM TEMPLE
GROUP BY NUMDE
HAVING MAX(SALAR)< (SELECT AVG(SALAR)
FROM TEMPLE)
6. Hallar el salario medio y la edad media en años para cada grupo de empleados con igual comisión y para
los que no la tengan.
SELECT COMIS,AVG(SALAR)AS [SALARIO
MEDIO],AVG(CONVERT(INT,DATEDIFF(DAY,FECNA,GETDATE())/365.25)) AS
[EDAD MEDIA]
FROM TEMPLE
GROUP BY COMIS
7. Para los departamentos en los que hay algún empleado cuyo salario sea mayor que 400000 ptas. al mes
hallar el número de empleados y la suma de sus salarios, comisiones y número de hijos.
SELECT NUMDE AS [NUMERO DE DEPARTAMENTO],
COUNT(NUMEMP)[CANTIDAD DE EMPLEADOS],
SUM(SALAR)AS [SUMA SALARIOS],
SUM(COMIS)AS [SUMA COMISIONES],
SUM(NUMHI)AS [SUMA NUMHI]
FROM TEMPLE
GROUP BY NUMDE,SALAR,COMIS,NUMHI
HAVING NUMDE IN(SELECT NUMDE
FROM TEMPLE
WHERE SALAR>400)
100
1
380
0
2
100
1
450
0
0
100
1
720
0
6
110
1
200
0
1
110
1
215
0
1
110
1
480
50
2
121
1
190
0
1
121
1
300
0
4
121
1
310
0
3
121
1
440
0
0
122
1
175
0
0
122
1
380
0
0
122
1
405
0
2
122
1
450
0
1
130
1
290
0
5
130
1
400
0
0
130
1
420
0
0
SELECT NUMDE AS [NUMERO DE DEPARTAMENTO],
COUNT(NUMEMP)[CANTIDAD DE EMPLEADOS],
SUM(SALAR)AS [SUMA SALARIOS],
SUM(COMIS)AS [SUMA COMISIONES],
SUM(NUMHI)AS [SUMA NUMHI]
FROM TEMPLE
WHERE NUMDE IN(SELECT NUMDE
FROM TEMPLE
WHERE SALAR>400)
GROUP BY NUMDE
100
3
1550
0
8
110
3
895
50
4
121
4
1240
0
8
122
4
1410
0
3
130
3
1110
0
5
COMO SE PUEDE INTERPRETAR DE
DOS MANERAS (O ASÍ LO CREO YO)
LO HE HECHO DE AMBAS MANERAS.
COMO VES, REALMENTE ES EL
MISMO RESULTADO
8. Para los departamentos en los que la antigüedad media de sus empleados supera a la edad media de la
empresa, hallar el salario mínimo, el medio y el máximo.
Select numde'Numero de Departamento', MIN(salar)'Salario Minimo',
max(salar)'Salario Maximo', avg(salar)'Salario Medio'
from TEMPLE
group by NUMDE
having AVG(CONVERT(int,datediff(day,FECNA,getdate())/365.25))>
(select avg((CONVERT(int,datediff(day,FECNA,getdate())/365.25))) from
temple)
order by NUMDE asc
9. Para los departamentos en los que haya algún empleado con más de 10 años de antigüedad y tales que la
media de hijos por cada uno de estos empleados sea superior a 1, hallar el salario medio de estos
empleados.
select numde 'Nº de Departamento', AVG(salar) 'Salario Medio'
from temple
group by numde
having numde = some (select numde
from TEMPLE
where NUMHI >1 and CONVERT(int,datediff(day,FECIN,getdate())/365.25)>
10)
10. Agrupando por número de hijos, hallar la media por hijo del total de salario y comisión.
SELECT numhi AS [NUMERO DE HIJOS],SUM((salar+comis)/numhi)AS[MEDIA
DEL SALARIO POR HIJOS]
FROM TEMPLE
GROUP BY NUMHI
HAVING NUMHI>0
11. Para cada departamento, hallar la media de la comisión con respecto a los empleados que la reciben y
con respecto al total de empleados.
SELECT numde, avg(comis)as media
FROM Temple
WHERE comis>0
group by NUMDE
union
select numde, SUM(COMIS)/COUNT(*)
from TEMPLE
group BY numde
12. Para cada extensión telefónica, hallar cuántos empleados la usan y el salario medio de éstos.
SELECT EXTEL,COUNT (NUMEMP) [CANTIDAD DE EMPLEADOS],AVG (SALAR)AS
[SALARIO MEDIO]
FROM TEMPLE
GROUP BY EXTEL
13. Para cada extensión telefónica y cada departamento, hallar cuántos empleados la usan y el salario medio
de éstos.
SELECT EXTEL,NUMDE,COUNT (NUMEMP) [CANTIDAD DE EMPLEADOS],AVG
(SALAR)AS [SALARIO MEDIO]
FROM TEMPLE
GROUP BY EXTEL,NUMDE
ORDER BY EXTEL,NUMDE
14. Hallar los números de extensión telefónica mayores de los diversos departamentos, sin incluir los
números de éstos.
SELECT MAX(EXTEL)
FROM TEMPLE
GROUP BY NUMDE
HAVING MAX(EXTEL)>=ALL(SELECT MAX(EXTEL)
FROM TEMPLE)
15. Para cada extensión telefónica, hallar el número de departamentos a los que sirve.
SELECT DISTINCT EXTEL,NUMDE
FROM TEMPLE
ORDER BY EXTEL,NUMDE
16. Para los departamentos en los que algún empleado tiene comisión, hallar cuántos empleados hay en
promedio por cada extensión telefónica.
SELECT NUMDE,COUNT(NUMEMP)/COUNT(DISTINCT EXTEL)AS [PROMEDIO POR
EXTENSION]
FROM TEMPLE
GROUP BY NUMDE
HAVING NUMDE IN (SELECT DISTINCT(NUMDE)
FROM TEMPLE
WHERE COMIS IS NOT NULL)
17. Para los departamentos en los que algún empleado tiene comisión, hallar cuántos empleados con
comisión hay en promedio por cada extensión telefónica.
SELECT NUMDE,COUNT(NOMEM)/COUNT(DISTINCT EXTEL)
FROM TEMPLE
WHERE COMIS IS NOT NULL
GROUP BY NUMDE
18. Obtener por orden creciente los números de extensiones telefónicas de los departamentos que tienen más
de dos y que son compartidas por menos de 4 empleados, excluyendo las que no son compartidas.
SELECT NUMDE,COUNT (DISTINCT EXTEL)AS[CANTIDAD EXT. TELEFONICAS]
FROM TEMPLE
GROUP BY NUMDE
HAVING COUNT (DISTINCT EXTEL)>2 AND COUNT(DISTINCT NOMEM)<4
ANDCOUNT(NUMEMP)<4 AND COUNT(NUMEMP)>1
ORDER BY NUMDE
19. Para los departamentos cuyo salario medio supera al de la empresa, hallar cuántas extensiones
telefónicas tienen.
SELECT NUMDE, COUNT(DISTINCT EXTEL)AS [CANTIDAD DE EXTENSIONES]
FROM TEMPLE
GROUP BY NUMDE
HAVING AVG(SALAR)>(SELECT AVG(SALAR)
FROM TEMPLE)
20. Para cada centro, hallar los presupuestos medios de los departamentos dirigidos en propiedad y en
funciones, excluyendo del resultado el número de centro.
SELECT AVG(PRESU)[PRESUPUESTO MEDIO],TIDIR
FROM TDEPTO
GROUP BY NUMCE,TIDIR
21. Hallar el máximo valor de la suma de los salarios de los departamentos.
SELECT (SUM(SALAR))AS [SUMA SALARIO MAXIMO],NUMDE
FROM TEMPLE
GROUP BY NUMDE
HAVING SUM(SALAR)>=ALL(SELECT SUM(SALAR)
FROM TEMPLE
GROUP BY NUMDE)
Descargar