Académique Documents
Professionnel Documents
Culture Documents
Pgina 1
ciudad
11
Valencia
28
Valencia
23
Madrid
El resultado coge los nombres de columna de la primera consulta y aparecen primero las filas de la
primera consulta y despus las de la segunda.
Si queremos que el resultado aparezca ordenado podemos incluir la clusula ORDER BY, pero
despus de la ltima especificacin de consulta, y expresion_columna ser cualquier columna
vlida de la primera consulta.
SELECT oficina as OFI, ciudad FROM Valencia
UNION
SELECT oficina, ciudad FROM Madrid
ORDER BY ofi;
OFI
ciudad
11
Valencia
23
Madrid
28
Valencia
Ahora las filas aparecen ordenadas por el nmero de oficina y hemos utilizado el nombre de
columna de la primera consulta.
Cuando aparezcan en el resultado varias filas iguales, el sistema por defecto elimina las
repeticiones.
Si se especifica ALL, el sistema devuelve todas las filas resultante de la unin incluidas las repetidas
Pgina 2
T2
Pgina 3
Ejemplo:
Listar los productos que no aparezcan en ningn pedido.
SELECT idfab, idproducto
FROM productos
EXCEPT
SELECT DISTINCT fab, producto
FROM pedidos;
Para practicar puedes realizar este Ejercicio La diferencia EXCEPT.
Nota: Para realizar los ejercicios, utiliza la base de datos Gestion (el archivo fsico se llamaba
GestionA) y GestionSimples.
Objetivo
Comparar dos tablas y crear un listado resultante de la comparacin. Los registros mostrados
sern los que tengan en comn.
Pgina 4
12
102
21
103
12
104
12
105
13
106
11
107
22
108
21
109
NULL
110
NULL
111
NULL
112
NULL
113
NULL
Pgina 5
Pgina 6
Objetivo
Combinar datos de dos tablas en una nica tabla.
Pgina 7
Nombre
Cuota
101
Antonio Viguer
30000,00
12
24
25000,00
101
Antonio Viguer
30000,00
12
29
10000,00
101
Antonio Viguer
30000,00
12
30
20000,00
102
Alvaro Jaumes
35000,00
21
22
30000,00
102
Alvaro Jaumes
35000,00
21
24
25000,00
102
Alvaro Jaumes
35000,00
21
29
10000,00
102
Alvaro Jaumes
35000,00
21
30
20000,00
103
Juan Rovira
27500,00
12
24
25000,00
103
Juan Rovira
27500,00
12
29
10000,00
103
Juan Rovira
27500,00
12
30
20000,00
104
Jos Gonzlez
20000,00
12
29
10000,00
105
Vicente Pantalla
35000,00
13
22
30000,00
105
Vicente Pantalla
35000,00
13
24
25000,00
105
Vicente Pantalla
35000,00
13
29
10000,00
105
Vicente Pantalla
35000,00
13
30
20000,00
106
Luis Antonio
27500,00
11
24
25000,00
106
Luis Antonio
27500,00
11
29
10000,00
106
Luis Antonio
27500,00
11
30
20000,00
107
Jorge Gutirrez
30000,00
22
24
25000,00
107
Jorge Gutirrez
30000,00
22
29
10000,00
107
Jorge Gutirrez
30000,00
22
30
20000,00
108
Ana Bustamante
35000,00
21
22
30000,00
108
Ana Bustamante
35000,00
21
24
25000,00
108
Ana Bustamante
35000,00
21
29
10000,00
Pgina 8
Ana Bustamante
35000,00
21
30
20000,00
nombre
oficina
ciudad
101
Antonio Viguer
12
Alicante
102
Alvaro Jaumes
21
Badajoz
103
Juan Rovira
12
Alicante
104
Jos Gonzlez
12
Alicante
105
Vicente Pantalla
13
Castelln
106
Luis Antonio
11
Valencia
107
Jorge Gutirrez
22
A Corua
108
Ana Bustamante
21
Badajoz
109
Mara Sunta
11
Valencia
110
Juan Victor
NULL
NULL
Pgina 9
nombre
oficina
ciudad
oficina
106
Luis Antonio
11
Valencia
11
109
Mara Sunta
11
Valencia
11
101
Antonio Viguer
12
Alicante
12
103
Juan Rovira
12
Alicante
12
104
Jos Gonzlez
12
Alicante
12
105
Vicente Pantalla
13
Castelln
13
102
Alvaro Jaumes
21
Badajoz
21
108
Ana Bustamante
21
Badajoz
21
107
Jorge Gutirrez
22
A Corua
22
NULL
NULL
NULL
Madrid
23
NULL
NULL
NULL
Aranjuez
24
NULL
NULL
NULL
Pamplona
26
NULL
NULL
NULL
Valencia
28
nombre
oficina
ciudad
oficina
101
Antonio Viguer
12
Alicante
12
102
Alvaro Jaumes
21
Badajoz
21
103
Juan Rovira
12
Alicante
12
104
Jos Gonzlez
12
Alicante
12
105
Vicente Pantalla
13
Castelln
13
106
Luis Antonio
11
Valencia
11
107
Jorge Gutirrez
22
A Corua
22
108
Ana Bustamante
21
Badajoz
21
109
Mara Sunta
11
Valencia
11
110
Juan Victor
NULL
NULL
NULL
NULL
NULL
NULL
Madrid
23
NULL
NULL
NULL
Aranjuez
24
NULL
NULL
NULL
Pamplona
26
NULL
NULL
NULL
Valencia
28
Aparecen tanto los empleados sin oficina como las oficinas sin empleados.
SELECT numemp,nombre,empleados.oficina, ciudad, oficinas.oficina
Pgina 10
Objetivo
Combinar datos de dos tablas que tienen algn dato en comn, con la finalidad de ampliar la
informacin en una nica tabla. Tendremos en cuenta los nulos, de forma que el LEFT o el RIGHT
indicarn qu tabla es la que deber aparecer, en caso de no tener correspondencia en la otra.
Pgina 11
Nombre
Edad
Titulo
Contrato
Jefe Oficina
Ciudad
Region
101
Antonio Viguer
45
representante
20/10/86
104
12
Alicante
este
102
Alvaro Jaumes
48
representante
10/12/86
108
21
Badajoz
oeste
103
Juan Rovira
29
representante
01/03/87
104
12
Alicante
este
104
Jos Gonzlez
33
dir ventas
19/05/87
106
12
Alicante
este
105
Vicente
Pantalla
37
representante
12/02/88
104
13
Castellon
este
106
Luis Antonio
52
director
general
14/06/88
NULL
11
Valencia
este
107
Jorge Gutirrez
49
representante
14/11/88
108
22
A Corua
oeste
108
Ana
Bustamante
62
dir ventas
12/10/89
106
21
Badajoz
oeste
109
Mara Sunta
31
representante
12/10/99
106
NULL
NULL
NULL
110
Juan Victor
41
representante
13/01/90
104
NULL
NULL
NULL
111
Juan Gris
50
representante
01/05/05
110
21
Badajoz
oeste
112
Julin
Martorell
50
representante
01/05/06
NULL
NULL
NULL
NULL
113
Juan Gris
18
representante
01/01/07
NULL
NULL
NULL
NULL
Ciudad
Region
Dir
Objetivo
Ventas
Director
Titulo
11
Valencia
este
106
57500,00
69300,00
Luis Antonio
director
general
12
Alicante
este
104
80000,00
73500,00
Jos Gonzlez
dir ventas
13
Castellon
este
105
35000,00
36800,00
Vicente
representante
Pgina 12
Badajoz
oeste
108
72500,00
84400,00
Ana
Bustamante
dir ventas
22
A Corua
oeste
108
30000,00
18600,00
Ana
Bustamante
dir ventas
23
Madrid
centro
108
NULL
NULL
Ana
Bustamante
dir ventas
24
Aranjuez
centro
108
25000,00
15000,00
Ana
Bustamante
dir ventas
25
Valencia
NULL
NULL
NULL
NULL
NULL
NULL
26
Pamplona
norte
NULL
NULL
200000,00
NULL
NULL
27
Mstoles
Centro
NULL
NULL
0,00
NULL
NULL
28
Valencia
este
NULL
90000,00
0,00
NULL
NULL
29
Valencia
este
NULL
10000,00
2100,00
NULL
NULL
30
pamplona
norte
NULL
20000,00
NULL
NULL
NULL
31
Elx
NULL
NULL
NULL
0,00
NULL
NULL
Listar las oficinas con objetivo superior a 60.000 euros indicando para cada una el nombre de su
director.
SELECT oficinas.*, nombre AS director
FROM oficinas LEFT JOIN empleados ON dir = numemp
WHERE objetivo > 60000;
Resultado:
Oficina
Ciudad
Region
Dir
Objetivo
Ventas
Director
12
Alicante
este
104
80000,00
73500,00
Jos Gonzlez
21
Badajoz
oeste
108
72500,00
84400,00
Ana Bustamante
28
Valencia
este
NULL
90000,00
0,00
NULL
Pgina 13
Clie
110036
1989-1012
00:00:00.0
00
210
7
11
0
aci
4100z
22,50
NUL
L
mont
110037
1989-1012
00:00:00.0
00
211
7
10
6
rei
2a44l
31,50
45,0
0
bomba l
112963
2008-0510
00:00:00.0
00
210
3
10
5
aci
41004
2
8
3,276
NUL
L
art t4
112968
1990-0111
00:00:00.0
00
210
2
10
1
aci
41004
3
4
39,78
NUL
L
art t4
112975
2008-0211
211
1
10
3
rei
2a44g
21,00
3,50
pas
Pgina 14
112979
1989-1012
00:00:00.0
00
211
4
10
8
aci
4100z
150,0
0
NUL
L
mont
112983
2008-0510
00:00:00.0
00
210
3
10
5
aci
41004
7,02
NUL
L
art t4
112987
2008-0101
00:00:00.0
00
210
3
10
5
aci
4100y
1
1
275,0
0
NUL
L
extracto
r
112989
2008-1210
00:00:00.0
00
210
1
10
6
fea
114
14,58
2,43
cubo
10
112992
1990-0415
00:00:00.0
00
211
8
10
8
aci
41002
1
0
7,60
NUL
L
bisagra
11
112993
2008-0310
00:00:00.0
00
210
6
10
2
rei
2a45c
2
4
18,96
0,79
junta
12
112997
2008-0404
00:00:00.0
00
212
4
10
7
bic
41003
6,52
6,52
manivel
a
13
113003
2008-0205
00:00:00.0
00
210
8
10
9
im
m
779c
56,25
18,7
5
reostat
o3
14
113007
2008-0101
00:00:00.0
00
211
2
10
8
im
m
773c
29,25
9,75
reostat
o
15
113012
2008-0505
00:00:00.0
00
211
1
10
5
aci
41003
3
5
37,45
NUL
L
art t3
16
113013
2008-1228
00:00:00.0
00
211
8
10
8
bic
41003
6,52
6,52
manivel
a
17
113024
2008-0704
00:00:00.0
00
211
4
10
8
qsa
xk47
2
0
71,00
3,55
red
18
113027
2008-0205
210
3
10
5
aci
41002
5
4
450,0
0
NUL
L
bisagra
Pgina 15
113034
2008-1105
00:00:00.0
00
210
7
11
0
rei
2a45c
6,32
0,79
junta
20
113042
2008-0101
00:00:00.0
00
211
3
10
1
rei
2a44r
225,0
0
45,0
0
bomba
r
21
113045
2008-0702
00:00:00.0
00
211
2
11
0
rei
2a44r
1
0
450,0
0
45,0
0
bomba
r
22
113048
2008-0202
00:00:00.0
00
212
0
10
2
im
m
779c
37,50
18,7
5
reostat
o3
23
113049
2008-0404
00:00:00.0
00
211
8
10
8
qsa
xk47
7,76
3,55
red
24
113051
2008-0706
00:00:00.0
00
211
8
10
8
qsa
xk47
14,20
3,55
red
25
113055
2009-0401
00:00:00.0
00
210
8
10
1
aci
4100x
1,50
NUL
L
junta
26
113057
2008-1101
00:00:00.0
00
211
1
10
3
aci
4100x
2
4
NULL
NUL
L
junta
27
113058
1989-0704
00:00:00.0
00
210
8
10
9
fea
112
1
0
14,80
1,48
cubo
28
113062
2008-0704
00:00:00.0
00
212
4
10
7
bic
41003
1
0
24,30
6,52
manivel
a
29
113065
2008-0603
00:00:00.0
00
210
6
10
2
qsa
xk47
21,30
3,55
red
30
113069
2008-0801
00:00:00.0
00
210
9
10
7
im
m
773c
2
2
313,5
0
9,75
reostat
o
Pgina 16
Listar los pedidos superiores a 250 euros, incluyendo el nombre del vendedor que tom el
pedido y el nombre del cliente que lo solicit.
Resultado:
Numpedid Fechapedid
o
o
3.
Clie
Rep
Fab
Cliente vendedor
112987
01/01/08
210
3
10
5
aci
4100y
11
275,0
0
Jaime
Lloren
s
Vicente
Pantalla
113027
05/02/08
210
3
10
5
aci
41002
54
450,0
0
Jaime
Lloren
s
Vicente
Pantalla
113045
02/07/08
211
2
11
0
rei
2a44r
10
450,0
0
Mara
Silva
Juan
Victor
113069
01/08/08
210
9
10
7
im
m
773c
22
313,5
0
Albert
o
Juanes
Jorge
Gutirre
z
Listar los pedidos superiores a 250 euros, mostrando el nombre del cliente que solicit el
pedido y el nombre del vendedor asignado a ese cliente.
Resultado:
Codig Numpedi Fechapedid Clie Rep Fab Produc Can Import Cliente Vendedor
o
do
o
to
t
e
asignado
4.
112987
2008-0101
00:00:00.
000
210
3
10
5
aci
4100
y
1
1
275,
00
Jaime
Llore
ns
Juan
Victor
18
113027
2008-0205
00:00:00.
000
210
3
10
5
aci
4100
2
5
4
450,
00
Jaime
Llore
ns
Juan
Victor
21
113045
2008-0702
00:00:00.
000
211
2
11
0
rei
2a44r
1
0
450,
00
Mara
Silva
Ana
Bustama
nte
30
113069
2008-0801
00:00:00.
000
210
9
10
7
im
m
773c
2
2
313,
50
Alber
to
Juane
s
Juan
Rovira
Listar los pedidos superiores a 250 euros, mostrando adems el nombre del cliente que
solicit el pedido y el nombre del vendedor asignado a ese cliente y la ciudad de la oficina
donde el vendedor trabaja.
Resultado:
Numpedido
Clie
Rep
Cliente
ciudad
112987
2103
105
Jaime Llorens
105
Juan Victor
NULL
113027
2103
105
Jaime Llorens
105
Juan Victor
NULL
Pgina 17
5.
113045
2112
110
Mara Silva
110
Ana Bustamante
Badajoz
113069
2109
107
Alberto Juanes
107
Juan Rovira
Alicante
Hallar los pedidos recibidos los das en que un nuevo empleado fue contratado.
Resultado:
Numpedido
6.
Fechapedido
Rep Numemp
Nombre
Contrato
110036
1989-10-12
00:00:00.000
110
108
Ana
Bustamante
1989-10-12
00:00:00.000
110037
1989-10-12
00:00:00.000
106
108
Ana
Bustamante
1989-10-12
00:00:00.000
112979
1989-10-12
00:00:00.000
108
108
Ana
Bustamante
1989-10-12
00:00:00.000
Hallar los empleados que realizaron su primer pedido el mismo da que fueron contratados.
Resultado:
Numemp
108
7.
Nombre
Ana
Bustamante
Contrato
1989-10-12
00:00:00.000
Numpedido Rep
112979
108
fechapedido
1989-10-12
00:00:00.000
Mostrar de cada empleado su cdigo, nombre, ventas, oficina y ciudad en la que est
ubicada su oficina.
Resultado:
Numemp
8.
Nombre
ventas
Oficina
ciudad
101
Antonio Viguer
30500,00
12
Alicante
102
Alvaro Jaumes
47400,00
21
Badajoz
103
Juan Rovira
28600,00
12
Alicante
104
Jos Gonzlez
14300,00
12
Alicante
105
Vicente Pantalla
36800,00
13
Castellon
106
Luis Antonio
29900,00
11
Valencia
107
Jorge Gutirrez
18600,00
22
A Corua
108
Ana Bustamante
36100,00
21
Badajoz
109
Mara Sunta
39200,00
NULL
NULL
110
Juan Victor
7600,00
NULL
NULL
111
Juan Gris
60000,00
NULL
NULL
112
Julin Martorell
91000,00
NULL
NULL
113
Juan Gris
0,00
NULL
NULL
Listar los empleados con una cuota superior a la de su jefe, los campos a obtener son el
nmero, nombre y cuota del empleado y nmero, nombre y cuota de su jefe.
Resultado:
Numemp
Nombre
Cuota
Jefe
Nombre jefe
Cuota jefe
Pgina 18
9.
101
Antonio Viguer
30000,00
104
Jos Gonzlez
20000,00
103
Juan Rovira
27500,00
104
Jos Gonzlez
20000,00
105
Vicente Pantalla
35000,00
104
Jos Gonzlez
20000,00
108
Ana Bustamante
35000,00
106
Luis Antonio
27500,00
Desde el entorno grfico cambia el empleado 111, asgnale el jefe 110 y la oficina 21.
Despus cambia la sentencia anterior para que salgan tambin los empleados cuyo jefe no
tenga cuota.
Resultado:
Numemp
Nombre
Cuota
Jefe
Nombre jefe
Cuota jefe
101
Antonio Viguer
30000,00
104
Jos Gonzlez
20000,00
103
Juan Rovira
27500,00
104
Jos Gonzlez
20000,00
105
Vicente Pantalla
35000,00
104
Jos Gonzlez
20000,00
108
Ana Bustamante
35000,00
106
Luis Antonio
27500,00
111
Juan Gris
10000,00
110
Juan Victor
NULL
10. Listar los empleados que no estn asignados a la misma oficina que su jefe, queremos
nmero, nombre y nmero de oficina tanto del empleado como de su jefe.
Resultado:
Numemp
Nombre
Oficina Jefe
Nombre jefe
Oficina jefe
104
Jos Gonzlez
12
106
Luis Antonio
11
105
Vicente Pantalla
13
104
Jos Gonzlez
12
107
Jorge Gutirrez
22
108
Ana Bustamante
21
108
Ana Bustamante
21
106
Luis Antonio
11
11. En el punto anterior no salen los que no tienen oficina, cambiar la sentencia para que
aparezcan.
Resultado:
Numemp
Nombre
Oficina Jefe
Nombre jefe
Oficina jefe
104
Jos Gonzlez
12
106
Luis Antonio
11
105
Vicente Pantalla
13
104
Jos Gonzlez
12
107
Jorge Gutirrez
22
108
Ana Bustamante
21
108
Ana Bustamante
21
106
Luis Antonio
11
109
Mara Sunta
NULL
106
Luis Antonio
11
110
Juan Victor
NULL
104
Jos Gonzlez
12
111
Juan Gris
21
110
Juan Victor
NULL
12. Lo mismo que la anterior pero queremos que aparezca tambin la ciudad de las oficinas
(tanto del empleado como de su jefe).
Resultado:
Pgina 19
Nombre
Oficina
Ciudad
Jefe
Nombre jefe
Oficina
jefe
ciudad
104
Jos Gonzlez
12
Alicante
106
Luis Antonio
11
Valencia
105
Vicente
Pantalla
13
Castellon
104
Jos Gonzlez
12
Alicante
107
Jorge
Gutirrez
22
A Corua
108
Ana
Bustamante
21
Badajoz
108
Ana
Bustamante
21
Badajoz
106
Luis Antonio
11
Valencia
109
Mara Sunta
NULL
NULL
106
Luis Antonio
11
Valencia
110
Juan Victor
NULL
NULL
104
Jos Gonzlez
12
Alicante
111
Juan Gris
21
Badajoz
110
Juan Victor
NULL
NULL
2.
Listar los pedidos superiores a 250 euros, incluyendo el nombre del vendedor que tom el
pedido y el nombre del cliente que lo solicit.
SELECT numpedido, CONVERT(CHAR(8),fechapedido,3) AS fechapedido, clie, rep, fab,
producto, cant, importe, clientes.nombre AS cliente, empleados.nombre AS vendedor
FROM (pedidos INNER JOIN empleados ON rep = numemp)
INNER JOIN clientes ON clie = numclie
WHERE importe > 250;
3.
Listar los pedidos superiores a 250 euros, mostrando el nombre del cliente que solicit el
pedido y el nombre del vendedor asignado a ese cliente.
SELECT pedidos.*, clientes.nombre AS cliente, empleados.nombre AS [vendedor
asignado]
FROM (pedidos INNER JOIN clientes ON clie = numclie)
INNER JOIN empleados ON repclie = numemp
WHERE importe > 250;
4.
Listar los pedidos superiores a 250 euros, mostrando adems el nombre del cliente que
solicit el pedido y el nombre del vendedor asignado a ese cliente y la ciudad de la oficina
donde el vendedor trabaja.
Pgina 20
5.
Hallar los pedidos recibidos los das en que un nuevo empleado fue contratado.
SELECT numpedido, fechapedido, rep, numemp, nombre, contrato
FROM pedidos, empleados
WHERE fechapedido=contrato;
6.
Hallar los empleados que realizaron su primer pedido el mismo da que fueron contratados.
SELECT numemp, nombre, contrato, numpedido, rep, fechapedido
FROM pedidos INNER JOIN empleados ON rep = numemp
WHERE fechapedido = contrato;
7.
Mostrar de cada empleado su cdigo, nombre, ventas, oficina y ciudad en la que est
ubicada su oficina.
SELECT numemp, nombre,empleados.ventas,empleados.oficina,ciudad
FROM empleados LEFT JOIN oficinas ON empleados.oficina=oficinas.oficina;
8.
Listar los empleados con una cuota superior a la de su jefe, los campos a obtener son el
nmero, nombre y cuota del empleado y nmero, nombre y cuota de su jefe.
SELECT empleados.numemp, empleados.nombre, empleados.cuota, empleados.jefe,
jefes.nombre AS [Nombre jefe], jefes.cuota AS [Cuota jefe]
FROM empleados LEFT JOIN empleados jefes ON empleados.jefe = jefes.numemp;
9.
Desde el entorno grfico cambia el empleado 111, asgnale el jefe 110 y la oficina 21.
Despus cambia la sentencia anterior para que salgan tambin los empleados cuyo jefe no
tenga cuota.
SELECT empleados.numemp, empleados.nombre, empleados.cuota, empleados.jefe,
jefes.nombre, jefes.cuota
FROM empleados INNER JOIN empleados jefes ON empleados.jefe = jefes.numemp
WHERE empleados.cuota > jefes.cuota OR
(empleados.cuota IS NOT NULL AND jefes.cuota IS NULL)
Pgina 21
11. En el punto anterior no salen los que no tienen oficina, cambiar la sentencia para que
aparezcan.
SELECT e.numemp, e.nombre, e.oficina, e.jefe, j.nombre as [nombre jefe], j.oficina AS
[oficina jefe]
FROM empleados e INNER JOIN empleados j ON e.jefe = j.numemp
WHERE e.oficina <> j.oficina OR e.oficina IS NULL OR j.oficina IS NULL;
12. Lo mismo que la anterior pero queremos que aparezca tambin la ciudad de las oficinas
(tanto del empleado como de su jefe).
SELECT e.numemp, e.nombre, e.oficina, ofiemp.ciudad, e.jefe, j.nombre as [nombre
jefe], j.oficina AS [oficina jefe], ofijefe.ciudad
FROM (oficinas ofiemp RIGHT JOIN empleados e ON ofiemp.oficina= e.oficina)
INNER JOIN (empleados j LEFT JOIN oficinas ofijefe ON j.oficina = ofijefe.oficina)
ON e.jefe = j.numemp
WHERE e.oficina <> j.oficina OR e.oficina IS NULL OR j.oficina IS NULL;
Obtener los empleados de GestionSimples que aparecen en GestionA con otra oficina.
SELECT numemp, oficina
FROM gestionsimples.dbo.empleados
EXCEPT
SELECT numemp, oficina
FROM gestionA.dbo.empleados;
Pgina 22
A la izquierda tenemos una consulta simple que nos saca las oficinas con sus ventas ordenadas
por regin, y a la derecha una consulta de resumen que obtiene la suma de las ventas de las
oficinas de cada regin
El grupo de valores sobre el que acta la funcin lo determina el resultado de la expresin que ser
un nombre de columna o una expresin basada en una columna o varias del origen de datos. En la
expresin nunca puede aparecer una funcin de agregado ni una subconsulta.
La palabra ALL indica que se tiene que tomar en cuenta todos los valores de la columna. Es el valor
por defecto.
Pgina 23
Pgina 24
Objetivo
Realizar consultas de resumen utilizando funciones de agregado. En este caso COUNT.
Pgina 25
Cuntas oficinas tienen empleados que superan su cuota (tienen supervit positivo)?
SELECT count(DISTINCT oficina) AS [Oficinas buenas]
FROM empleados
WHERE ventas > cuota ;
Resultado:
Oficinas buenas
|4
Pgina 26
Objetivo
Realizar consultas de resumen utilizando funciones de agregado. En este caso MAX.
Pgina 27
Objetivo
Realizar consultas de resumen utilizando funciones de agregado. En este caso SUM.
440000,00
Cul es el importe total de los pedidos realizados por el empleado Luis Antonio?
SELECT SUM(importe) AS [Importe vendido]
FROM pedidos INNER JOIN empleados ON rep = numemp
WHERE nombre = 'Luis Antonio';
Resultado:
Importe vendido
46,08
Pgina 28
Pgina 29
11
12
Pgina 30
21
22
Hay empleados sin oficinas (con oficina a nulo), estos forman un grupo con el valor NULL en
oficina, en este caso hay dos empleados as.
Podemos indicar varias columnas de agrupacin.
Ejemplo:
SELECT rep, clie, count(numpedido) AS [Nmero de pedidos], MAX(importe) AS [Importe mximo]
FROM pedidos
WHERE YEAR(fechapedido) = 1997
GROUP BY rep, clie
ORDER BY rep, clie;
Resultado:
rep
clie
Nmero Importe
de pedidos mximo
101
2113
225,00
102
2106
21,30
102
2120
37,50
103
2111
21,00
105
2103
275,00
105
2111
37,45
106
2101
14,58
107
2109
313,50
107
2124
24,30
108
2112
29,25
108
2114
71,00
Pgina 31
2118
14,20
clie
Nmero Importe
de pedidos mximo
101
2102
NULL
101
2108
NULL
101
2113
225,00
102
2106
21,30
102
2120
37,50
103
2111
21,00
105
2103
275,00
105
2111
37,45
106
2101
14,58
106
2117
NULL
107
2109
313,50
107
2124
24,30
108
2112
29,25
108
2114
71,00
108
2118
14,20
Cul ha sido el efecto de aadir ALL? Se han aadido filas para las filas del origen que no cumplen
la condicin del WHERE pero sin que intervengan en el clculo de las funciones de agregado.
Pgina 32
clie
Nmero Importe
de pedidos mximo
101
2113
225,00
101
NULL
225,00
102
2106
21,30
102
2120
37,50
102
NULL
37,50
103
2111
21,00
103
NULL
21,00
105
2103
275,00
105
2111
37,45
105
NULL
275,00
106
2101
14,28
106
NULL
14,28
107
2109
313,50
107
2124
24,30
107
NULL
313,50
108
2112
29,25
108
2114
71,00
108
2118
14,20
108
NULL
71,00
...
...
...
...
NULL
NULL
23
450,00
Efecto: Se han aadido automticamente subtotales por cada nivel de agrupamiento y una lnea de
totales generales al final. En este caso no hemos incluido ORDER BY porque las filas salen ya
ordenadas.
Pgina 33
clie
Nmero Importe
de pedidos mximo
101
2113
225,00
101
NULL
225,00
102
2106
21,30
102
2120
37,50
102
NULL
37,50
103
2111
21,00
103
NULL
21,00
105
2103
275,00
105
2111
37,45
105
NULL
275,00
106
2101
14,28
106
NULL
14,28
107
2109
313,50
107
2124
24,30
107
NULL
313,50
108
2112
29,25
108
2114
71,00
108
2118
14,20
108
NULL
71,00
...
...
...
...
NULL
NULL
23
450,00
NULL
2101
14,58
NULL
2103
275,00
NULL
2106
21,30
NULL
2107
6,32
NULL
2108
56,25
NULL
2109
313,50
NULL
2111
37,45
Pgina 34
2112
450,00
NULL
2113
225,00
NULL
2114
71,00
NULL
2118
14,20
NULL
2120
37,50
NULL
2124
24,30
Efecto: Obtenemos adems de los resultados obtenidos con ROLLUP (los totales por cada
representante), los totales por el otro criterio (los totales por cada cliente).
El nmero de filas de resumen del conjunto de resultados se determina mediante el nmero de
columnas que contiene la clusula GROUP BY. Cada operando (columna) de la clusula GROUP BY
se enlaza segn el agrupamiento NULL y se aplica el agrupamiento al resto de los operandos
(columnas). CUBE devuelve todas las combinaciones posibles de grupo y subgrupo.
Tanto si utilizamos CUBE como ROLLUP, nos ser til la funcin de agregado GROUPING.
Si cogemos por ejemplo la primera fila remarcada (101 NULL ) el valor NULL, no sabemos si se
refiere a una fila de subtotal o a que el representante 101 ha realizado un pedido sin nmero de
cliente. Para poder salvar este problema se utiliza la funcin de agregado GROUPING.
SELECT rep, clie, count(numpedido) AS [Nmero de pedidos], MAX(importe) AS [Importe mximo],
GROUPING(clie) AS [Fila resumen]
FROM pedidos
WHERE YEAR(fechapedido) = 1997
GROUP BY rep, clie WITH ROLLUP;
rep
clie
Nmero Importe
Fila
de pedidos mximo Resumen
101
2113
225,00
101
NULL
225,00
102
2106
21,30
102
2120
37,50
102
NULL
37,50
103
2111
21,00
Las filas que corresponden a subtotales aparecen con un 1 y las normales con un cero.
Ahora que estamos ms familiarizados con las columnas de agrupamiento debemos comentar una
regla a no olvidar:
EN LA LISTA DE SELECCIN DE UNA CONSULTA DE RESUMEN UN NOMBRE DE COLUMNA NO
PUEDE APARECER FUERA DE UNA FUNCIN DE AGREGADO SI NO ES UNA COLUMNA DE
AGRUPACIN.
Para practicar puedes realizar este Ejercicio Agrupar filas con GROUP BY.
Nota: Para realizar los ejercicios, utiliza la base de datos GestionSimples.
Objetivo
Ing. Jos Rodrguez Mantilla
Pgina 35
88,76
102
25,92
103
21,00
105
154,5492
106
23,04
107
114,7733
108
40,9042
109
35,525
110
159,6066
Repetir la consulta pero para que tambin salgan los empleados que no han vendido nada.
SELECT numemp, AVG(importe) AS [Importe medio]
FROM pedidos RIGHT JOIN empleados ON rep = numemp
GROUP BY numemp;
Resultado:
rep Importe medio
101
88,76
102
25,92
Pgina 36
21,00
104
NULL
105
154,5492
106
23,04
107
114,7733
108
40,9042
109
35,525
110
159,6066
111
NULL
112
NULL
113
NULL
114
NULL
Cul es en cada una de las oficinas, el rango de cuotas asignadas a sus vendedores?
SELECT oficinas.oficina, MIN(cuota) AS [Cuota mnima], MAX(cuota) AS [Cuota mxima]
FROM oficinas LEFT JOIN empleados ON empleados.oficina = oficinas.oficina
GROUP BY oficinas.oficina;
Resultado:
oficina Cuota mnima Cuota mxima
11
27500,00
27500,00
12
20000,00
30000,00
13
35000,00
40000,00
21
10000,00
35000,00
22
30000,00
30000,00
23
NULL
NULL
Pgina 37
NULL
NULL
25
NULL
NULL
26
NULL
NULL
27
NULL
NULL
28
NULL
NULL
29
NULL
NULL
30
NULL
NULL
31
NULL
NULL
Listar cuntos empleados estn asignados a cada oficina, incluso las que no tienen.
SELECT oficinas.oficina, COUNT(numemp) AS Empleados
FROM oficinas LEFT JOIN empleados ON empleados.oficina = oficinas.oficina
GROUP BY oficinas.oficina;
Resultado:
oficina Empleados
11
12
13
21
22
23
24
25
26
27
Pgina 38
29
30
31
Listar cuntos clientes son atendidos por cada empleado (el cliente ha realizado un pedido
con l).
SELECT rep, COUNT(DISTINCT clie) AS [Clientes atendidos]
FROM pedidos
GROUP BY rep;
Resultado:
rep
Clientes
atendidos
101
102
103
105
106
107
108
109
110
Pgina 39
22
Esta SELECT es la misma que la del primer ejemplo del apartado sobre la clusula GROUP BY, la
diferencia es que le hemos aadido la clusula HAVING, que hace que del resultado slo se
visualicen los grupos que cumplan la condicin. Es decir slo aparecen las oficinas que tienen
menos de 2 empleados.
Siempre que en una condicin de seleccin haya una funcin de columna, la condicin deber
incluirse en la clusula HAVING, adems, como HAVING filtra filas del resultado, slo puede
contener expresiones (nombres de columnas, expresiones, funciones) que tambin pueden
aparecer en la lista de seleccin, por lo que tambin se aplica la misma regla a no olvidar:
EN LA CLUSULA HAVING UN NOMBRE DE COLUMNA NO PUEDE APARECER FUERA DE UNA
FUNCIN DE AGREGADO SI NO ES UNA COLUMNA DE AGRUPACIN.
Las expresiones que pongamos en HAVING no tienen porqu aparecer en la lista de seleccin, por
ejemplo en la SELECT anterior se poda haber escrito:
HAVING SUM(ventas)=10000
Para practicar puedes realizar este Ejercicio Seleccin sobre agrupaciones con HAVING.
Nota: Para realizar los ejercicios, utiliza la base de datos GestionSimples.
Objetivo
Filtrar los resultados de una consulta de resumen con GROUP BY, mediante la clusula HAVING.
Pgina 40
154,5492
107
114,7733
110
159,6066
nombre
Importe medio
105
Vicente Pantalla
154,5492
107
Jorge Gutirrez
114,7733
110
Juan Victor
159,6066
Por cada oficina con 2 o ms personas, calcula la cuota total y las ventas totales de todos los
empleados que trabajan en la oficina, de la oficina queremos el nmero y la ciudad.
SELECT oficinas.oficina, ciudad, SUM(cuota) AS [Cuota total], SUM(empleados.ventas) AS ventas
FROM empleados INNER JOIN oficinas ON empleados.oficina = oficinas.oficina
GROUP BY oficinas.oficina, ciudad
HAVING COUNT(*) > 2;
Resultado:
Pgina 41
ciudad
Cuota total
ventas
12
Alicante
77500,00
73400,00
21
Badajoz
80000,00
143500,00
2.
3.
4.
35000,00
De cada vendedor (todos) queremos saber su nombre y el importe total vendido. En caso de
que el importe sea NULL, cambiarlo por 0,00 con la funcin ISNULL().
Resultado:
Pgina 42
2.
nombre
Importe vendido
101
Antonio Viguer
266,28
102
Alvaro Jaumes
77,76
103
Juan Rovira
21,00
104
Jos Gonzlez
0,00
105
Vicente Pantalla
772,746
106
Luis Antonio
46,08
107
Jorge Gutirrez
344,32
108
Ana Bustamante
286,33
109
Mara Sunta
71,05
110
Juan Victor
478,82
111
Juan Gris
0,00
112
Julin Martorell
0,00
113
Juan Gris
0,00
114
Pablo Moreno
0,00
3.
106
2101
14,58
101
2102
39,78
105
2103
735,296
102
2106
40,26
110
2107
28,82
101
2108
1,50
109
2108
71,05
107
2109
313,50
103
2111
21,00
105
2111
37,45
108
2112
29,25
110
2112
450,00
101
2113
225,00
108
2114
221,00
106
2117
31,50
108
2118
36,08
102
2120
37,50
107
2124
30,82
Repetir la consulta anterior pero ahora deben aparecer tambin los empleados que no han
vendido nada.
Resultado:
Pgina 43
4.
101
2102
39,78
101
2108
1,50
101
2113
225,00
102
2106
40,26
102
2120
37,50
103
2111
21,00
104
NULL
NULL
105
2103
735,296
105
2111
37,45
106
2101
14,58
106
2117
31,50
107
2109
313,50
107
2124
30,82
108
2112
29,25
108
2114
221,00
108
2118
36,08
109
2108
71,05
110
2107
28,82
110
2112
450,00
111
NULL
NULL
112
NULL
NULL
113
NULL
NULL
114
NULL
NULL
Repetir la consulta pero ahora debe aparecer tambin el total de cunto ha vendido cada
empleado. (Recuerda una opcin de la clusula GROUP BY)
Resultado:
rep
clie
Importe vendido
NULL
NULL
2364,386
101
NULL
266,28
101
2102
39,78
101
2108
1,50
101
2113
225,00
102
NULL
77,76
102
2106
40,26
102
2120
37,50
103
NULL
21,00
103
2111
21,00
104
NULL
NULL
104
NULL
NULL
105
NULL
772,746
Pgina 44
5.
105
2103
735,296
105
2111
37,45
106
NULL
46,08
106
2101
14,58
106
2117
31,50
107
NULL
344,32
107
2109
313,50
107
2124
30,82
108
NULL
286,33
108
2112
29,25
108
2114
221,00
108
2118
36,08
109
NULL
71,05
109
2108
71,05
110
NULL
478,82
110
2107
28,82
110
2112
450,00
111
NULL
NULL
111
NULL
NULL
112
NULL
NULL
112
NULL
NULL
113
NULL
NULL
113
NULL
NULL
114
NULL
NULL
114
NULL
NULL
En los resultados anteriores no se distinguen bien las lneas que corresponden a totales.
Modificar la consulta para obtener este resultado:
Importe vendido
Agrupa Agrupa
clie numemp
NULL
2364,386
101
NULL
266,28
101
2102
39,78
101
2108
1,50
101
2113
225,00
102
NULL
77,76
102
2106
40,26
102
2120
37,50
103
NULL
21,00
103
2111
21,00
104
NULL
NULL
104
NULL
NULL
rep
clie
NULL
Pgina 45
....
... (sigue)
...
...
Ahora modifica la consulta para que las filas de totales aparezcan ms claras. (Recuerda la
funcin CASE)
Resultado:
7.
rep
clie
Importe vendido
NULL
NULL
2364,386
Total empleado
101
NULL
266,28
Total empleado
101
2102
39,78
101
2108
1,50
101
2113
225,00
102
NULL
77,76
102
2106
40,26
102
2120
37,50
103
NULL
21,00
103
2111
21,00
104
NULL
NULL
104
NULL
NULL
Total empleado
...
....
... (sigue)
...
Agrupa
numemp
Agrupa clie
Total final
Total empleado
Total empleado
...
Agrupa clie
rep
clie
Total empleado
NULL
NULL
2364,386
Total empleado
101
NULL
266,28
101
2102
39,78
101
2108
1,50
101
2113
225,00
102
NULL
77,76
102
2106
40,26
102
2120
37,50
103
NULL
21,00
103
2111
21,00
104
NULL
NULL
Total empleado
104
NULL
NULL
...
...
....
...
Total empleado
Total empleado
... (sigue)
Importe vendido
Pgina 46
Ahora queremos que "Total empleado" aparezca en la columna clie. Piensa primero en
cuntas columnas quieres y luego en cada columna que tiene que salir.
Resultado:
Agrupa
numemp
numemp
Total final
... (sigue)
9.
clie
Importe vendido
NULL
Total empleado
2364,386
101
Total empleado
266,28
101
2102
39,78
101
2108
1,50
101
2113
225,00
102
Total empleado
77,76
102
2106
40,26
102
2120
37,50
103
Total empleado
21,00
103
2111
21,00
104
NULL
NULL
104
Total empleado
NULL
...
....
...
El empleado 104 (y otros) no ha vendido a nadie y por eso sale en la columna clie la palabra
NULL, queremos que en estos casos no aparezca nada (se deje en blanco), y el importe si es
NULL que salga un cero.
Resultado:
Agrupa
numemp
numemp
Total final
clie
NULL
Total empleado
2364,386
101
2102
39,78
101
2108
1,50
101
2113
225,00
101
Total empleado
266,28
102
2106
40,26
102
2120
37,50
102
Total empleado
77,76
103
2111
21,00
103
Total empleado
21,00
104
... (sigue)
Importe vendido
0,00
104
Total empleado
0,00
...
....
...
Pgina 47
clie
...
2364,386
101
2102
39,78
101
2108
1,50
101
2113
225,00
101
Total empleado
266,28
102
2106
40,26
102
2120
37,50
102
Total empleado
77,76
103
2111
21,00
103
Total empleado
21,00
104
... (sigue)
Importe vendido
...
0,00
104
Total empleado
0,00
...
....
...
Pgina 48
Pgina 49
Pgina 50
Pgina 51