Ejercicios SQL Group By

Embed Size (px)

Citation preview

EJERCICIOS SQL GROUP BY

Javier Garca Cambronel PRIMERO DE ASIR

[EJERCICIOS SQL GROUP BY]

COMO IMPORTAR UNA BASE DE DATOS

SOLUCION EJERCICIOS SQL GROUP BY

PRIMERO DE ASIR

Pgina 1

[EJERCICIOS SQL GROUP BY]

COMO IMPORTAR UNA BASE DE DATOSLo primero que debemos hacer es pulsar el botn derecho sobre bases de datos y selecionar la opcion Adjuntar como vemos en la siguiente imagen:

Una vez hecho esto, veremos la siguiente ventana, donde tendremos que pulsar al boton agregar.

PRIMERO DE ASIR

Pgina 2

[EJERCICIOS SQL GROUP BY]Una vez que hemos pulsado sobre el botn agregar, nos aparecera un explorador, en el cual nos tendremos que desplazar y seleccionar, donde se encuentra el archivo de la base de datos que vamos a importar, una vez que hemos seleccionado dicho archivo, pulsamos el boton aceptar.

Cuando hemos pulsado en aceptar, ya veremos la siguiente pantalla donde se encuentra la direccion y el archivo que hemos escogido, con la base de datos que vamos a importar y solo tendremos que pulsar el boton aceptar para que los cambios, es decir, para que la imporatacion se lleve a cabo.

Y como podemos observar, todo se ha llevado a cabo correctamente y podremos empezar a utilizar dicha base de datos.

PRIMERO DE ASIR

Pgina 3

[EJERCICIOS SQL GROUP BY]

SOLUCION EJERCICIOS SQL GROUP BY1. 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().Como podemos ver hacemos una seleccin del nombre de los empleados, utilizamos la funcion isnull para que en el caso de que la suma del importe tenga el valor null cambiarlo por 0 todo esto lo nombramos segn nos pide el ejercicio, como : importe total vendido, hacemos un LEFT JOIN entre empleados y pedidos y hacemos la comparacin entre numemp y reptodo ello agrupando para que se lleve a cabo correctamente numemp y nombre. SELECT numemp, nombre, ISNULL(SUM(importe),0) AS [Importe total vendido] FROM empleados LEFT JOIN pedidos ON numemp = rep GROUP BY numemp, nombre;

PRIMERO DE ASIR

Pgina 4

[EJERCICIOS SQL GROUP BY] 2. De cada empleado, obtener el importe vendido a cada cliente.Hacemos una seleccin de empleados y de los clientes renombrando clie por el nombre de cliente, hacemos la suma del importe y lo renombramos como importe total vendido, todo esto desde la tabla pedidos y agrupando los productos y clientes con group by. select rep, clie as Cliente, SUM(importe) as [Importe total vendido] from pedidos group by rep, clie;

PRIMERO DE ASIR

Pgina 5

[EJERCICIOS SQL GROUP BY] 3. Repetir la consulta anterior pero ahora deben aparecer tambin los empleados que no han vendido nada.Seleccionamos el numero de empleado y cliente hacemos la suma del importe y lo renombramos como importe vendido haciendo um left joindesde la tabla empleados y pedidos y comparando que el nmero de empleado sea igual a rep, despues agrupamos numemp y clie para que se pueda llevar a cabo con group by. select numemp, clie, SUM(importe) as [Importe vendido] from empleados LEFT JOIN pedidos on numemp = rep group by numemp, clie;

PRIMERO DE ASIR

Pgina 6

[EJERCICIOS SQL GROUP BY] 4. Repetir la consulta pero ahora debe aparecer tambin el total de cunto ha vendido cada empleado.Como vemos el cdigo es igual al anterior pero aadimos um ROLLUP que genera un conjunto de resultados que muestra agregados para una jerarqua de valores de las columnas seleccionadas en este caso nos va a servor para obtener el total de lo que ah vendido cada empleado y despues ordenaremos los resultados con order by, aunke esto ltimo es opcional. select numemp, clie, sum(importe) as [Importe vendido] from empleados left join pedidos on numemp = rep group by numemp, clie with rollup order by numemp,clie;

PRIMERO DE ASIR

Pgina 7

[EJERCICIOS SQL GROUP BY] 5. En los resultados anteriores no se distinguen bien las lneas que corresponden a totales. Modificar la consulta para indicar con un 1 si es una fila de totales y con un 0 si no lo es.La consulta es igual que la anterior pero utilizamos GROUPING para distinguir entre los valores NULL devueltos por ROLLUP e indicamos as si es una fila de totales o no. select numemp, clie, sum(importe) as [Importe vendido], GROUPING(clie) as [fila de totales cliente], GROUPING(numemp) AS [fila de totales empleados] FROM empleados LEFT JOIN pedidos ON numemp = rep GROUP BY numemp, clie WITH ROLLUP ORDER BY numemp,clie;

PRIMERO DE ASIR

Pgina 8

[EJERCICIOS SQL GROUP BY] 6. Ahora modifica la consulta para que las filas de totales aparezcan ms claras, substituyendo el 1 de Agrupa clie por "Total empleado", el 1 de Agrupa numemp por Total final y el valor 0 por espacio en blanco.Lo mismo que la consulta anterior pero imponiendo dos casos en grouping, donde indicamos que cuando sea 0 se deje el espacio em blanco y cuando sea 1 el valor, escribir lo que queremos total empleado en el primer caso y total final en el segundo. SELECT numemp, clie, SUM(importe) AS [Importe vendido], CASE GROUPING(clie) WHEN 0 THEN ' ' WHEN 1 THEN 'Total empleado' END AS [Filas de totaels clientes], CASE GROUPING(numemp) WHEN 0 THEN ' ' ELSE 'Total Final' END AS [Filas de totales empleados] FROM empleados LEFT JOIN pedidos ON numemp = rep GROUP BY numemp, clie WITH ROLLUP ORDER BY numemp,clie;

PRIMERO DE ASIR

Pgina 9

[EJERCICIOS SQL GROUP BY] 7. Ahora coloca las columnas Agrupa delante de las dems columnas.Hacemos lo mismo que en el caso anterior, solo que esta vez cada case de grouping lo situamos antes, para que as se muestre como se nos pide. SELECT CASE GROUPING(numemp) WHEN 0 THEN ' ' WHEN 1 THEN 'Total Final' END AS [Filas de totales empleados], CASE GROUPING(clie) WHEN 0 THEN ' ' WHEN 1 THEN 'Total empleado' END AS [Filas de totales clientes], numemp, clie, SUM(importe) AS [Importe vendido] FROM empleados LEFT JOIN pedidos ON numemp = rep GROUP BY numemp, clie WITH ROLLUP ORDER BY numemp,clie;

PRIMERO DE ASIR

Pgina 10

[EJERCICIOS SQL GROUP BY] 8. Ahora queremos que "Total empleado" aparezca en la columna clie.Para hacer lo que se nos pide en este ejercicio lo indicamos asi en el segundo case, as cuando el valor retorna 1 se escribe en la columna Clie total empleado como se nos pide. SELECT CASE GROUPING(numemp) WHEN 0 THEN ' ' ELSE 'Total Final' END AS [Filas de totales empleados], numemp, CASE GROUPING(clie) WHEN 0 THEN CONVERT(CHAR(4),clie) WHEN 1 THEN 'Total empleado' END AS [Clie], SUM(importe) AS [Importe vendido] FROM empleados LEFT JOIN pedidos ON numemp = rep GROUP BY numemp, clie WITH ROLLUP ORDER BY numemp,clie;

PRIMERO DE ASIR

Pgina 11

[EJERCICIOS SQL GROUP BY] 9. 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.Hacemos lo que nos indica el ejercicio y para ello solo tendremos que cambiar del cdigo con el case correspindiente con el groping de cliente donde indicamos que cuando el valor es null se muestre la celda vaca, al igual que para cuando el importe sea null salga 0 hacemos como hicimos en el primer ejercicio que esta en el principio del trabajo, utilizando ISNULL y asignandole dicho valor cuando la suma del importe sea nula. SELECT CASE GROUPING(numemp) WHEN 0 THEN ' ' ELSE 'Total Final' END AS [Filas de totales empleados], numemp, CASE WHEN GROUPING(clie) = 1 THEN 'Total empleado' WHEN clie IS NULL THEN ' ' ELSE CONVERT(CHAR(4),clie) END AS [Clie], ISNULL(SUM(importe),0) AS [Importe vendido] FROM empleados LEFT JOIN pedidos ON numemp = rep GROUP BY numemp, clie WITH ROLLUP ORDER BY numemp,clie;

PRIMERO DE ASIR

Pgina 12

[EJERCICIOS SQL GROUP BY] 10. Lo rematamos para que la fila del Total final no muestre los valores "NULL" ni "Total empleado". En cambio, los cambiaremos por tres puntos. Tampoco mostraremos el encabezado "Agrupa numemp".Hacemos lo que se nos pide como en el caso anterior con la clausula isnull para los valores nulos de la fila total final con la conversin correspondiente y en el grouping de numemp cuando obtenga el valor 1 mostraremos tambin para no mostrar en encabezado en la primera lnea del cdigo el END AS esta en blanco. SELECT CASE GROUPING(numemp) WHEN 0 THEN ' ' ELSE 'Total Final' END AS [ ], ISNULL(CONVERT(CHAR(3),numemp),'... ') AS [numemp], CASE WHEN GROUPING(clie) = 1 AND GROUPING(numemp) = 0 THEN 'Total empleado' WHEN GROUPING(clie) = 1 AND GROUPING(numemp) = 1 THEN '...' WHEN clie IS NULL THEN ' ' ELSE CONVERT(CHAR(4),clie) END AS [Clie], ISNULL(SUM(importe),0) AS [Importe vendido] FROM empleados LEFT JOIN pedidos ON numemp = rep GROUP BY numemp, clie WITH ROLLUP ORDER BY numemp,clie;

PRIMERO DE ASIR

Pgina 13