Guia lab08 bd

11
Universidad Nacional Jorge Basadre Grohmann /FACI Escuela Académico Profesional de Ingeniería en Informática y Sistemas Curso: Bases de Datos y Sistemas Distribuidos Año :IIIPeriodo Académico: 2007 Prof: Ing. Edgar Taya Acosta-http://www.edgartaya.net - [email protected] Pág. 1/11 Ing. Edwin Ramos Velásquez Guía de práctica de laboratorio 08 Tema: Consultas avanzadas OBJETIVOS Realizar de Consultas avanzadas: Subconsultas, columnas calculadas. Uso de Funciones Agregadas la lenguaje SQL (COUNT, SUM, MAX, MIN, AVG). Cláusulas, predicados y Operadores SQL. Combinación de múltiples tablas (INNER JOIN, OUTER JOIN), Tipos de Combinación de tablas (Combinación Interna y/o Externa) y las diferencias entre las sintaxis del lenguaje SQL−89 y SQL-92. UNION de tablas. Vistas. I. Fundamento Teórico: Busque en la ayuda de Transact-SQL ó en Libros en Pantalla de SQL Server los comandos que se usarán en la presente práctica. II.- Práctica Dirigida: Inicializar la Computadora con el sistema operativo Microsoft Windows XP. Iniciar sesión con el usuario BDNNN. (Donde NNN es nro. de Computadora) Luego cargar el Administrador corporativo de SQL Server. Realizar la conexión al servidor usando el inicio de sesión del usuario 01 creado en la práctica1. (Recuerde ya no debe usar SA, el profesor del curso usará este inicio de sesión SA y tendrá una clave de acceso) 2.1. Creación de Consultas en el Analizador de Consultas Seleccionar su base datos y ubícate en la sección tablas. Ahora ir al menú Herramientas Analizador de Consultas. Usted debe conectarse con el usuario02. Ahora realizar las siguientes consultas. Nota: No se olvide de guardar las consultas (Comando SQL y el resultado) a) Ejemplo1: Realice una consulta que muestre los pedidos en el año 2002, en los meses de enero, febrero y diciembre, de todos los clientes de la ciudad de Madison ó Kingston de los Estados Unidos, donde el monto del pedido sea mayor a $1,000 y el cliente tenga una dirección conocida. La información a mostrar es: Nro de pedido, fecha de pedido, Monto de Pedido. Esta información debe estar ordenada por fecha de pedido y el monto de pedido. Para esta consulta Usted solo debe usar Subconsultas. b) La codificación será de la siguiente manera: SELECT Nro_Pedido, Fecha_pedido, Monto_pedido FROM Pedido WHERE (YEAR(Fecha_pedido) = 2002) AND (MONTH(Fecha_pedido) IN (1, 2, 12)) AND (Monto_pedido > 1000) AND (Cod_cliente IN (SELECT cod_cliente FROM cliente WHERE Ciudad = 'Madison' OR Ciudad = 'Kingston' AND Direccion_1 IS NOT NULL)) ORDER BY Fecha_pedido, Monto_pedido

Transcript of Guia lab08 bd

Page 1: Guia lab08 bd

Universidad Nacional Jorge Basadre Grohmann /FACIEscuela Académico Profesional de Ingeniería en Informática y SistemasCurso: Bases de Datos y Sistemas Distribuidos Año :IIIPeriodo Académico: 2007

Prof: Ing. Edgar Taya Acosta-http://www.edgartaya.net - [email protected] Pág. 1/11 Ing. Edwin Ramos Velásquez

Guía de práctica de laboratorio 08Tema: Consultas avanzadas

OBJETIVOS Realizar de Consultas avanzadas: Subconsultas, columnas calculadas. Uso de Funciones Agregadas la lenguaje SQL (COUNT, SUM, MAX, MIN,

AVG). Cláusulas, predicados y Operadores SQL. Combinación de múltiples tablas (INNER JOIN, OUTER JOIN), Tipos de

Combinación de tablas (Combinación Interna y/o Externa) y las diferenciasentre las sintaxis del lenguaje SQL−89 y SQL-92. UNION de tablas. Vistas.

I. Fundamento Teórico: Busque en la ayuda de Transact-SQL ó en Libros en Pantalla de SQL Server

los comandos que se usarán en la presente práctica.

II.- Práctica Dirigida: Inicializar la Computadora con el sistema operativo Microsoft Windows XP.

Iniciar sesión con el usuario BDNNN. (Donde NNN es nro. de Computadora) Luego cargar el Administrador corporativo de SQL Server. Realizar la

conexión al servidor usando el inicio de sesión del usuario 01 creado en lapráctica1. (Recuerde ya no debe usar SA, el profesor del curso usará esteinicio de sesión SA y tendrá una clave de acceso)

2.1. Creación de Consultas en el Analizador de Consultas Seleccionar su base datos y ubícate en la sección tablas. Ahora ir al menú

Herramientas Analizador de Consultas. Usted debe conectarse con elusuario02. Ahora realizar las siguientes consultas. Nota: No se olvide de guardarlas consultas (Comando SQL y el resultado)

a) Ejemplo1: Realice una consulta que muestre los pedidos en el año 2002, en losmeses de enero, febrero y diciembre, de todos los clientes de la ciudad deMadison ó Kingston de los Estados Unidos, donde el monto del pedido seamayor a $1,000 y el cliente tenga una dirección conocida. La información amostrar es: Nro de pedido, fecha de pedido, Monto de Pedido. Esta informacióndebe estar ordenada por fecha de pedido y el monto de pedido. Para estaconsulta Usted solo debe usar Subconsultas.

b) La codificación será de la siguiente manera:SELECT Nro_Pedido, Fecha_pedido, Monto_pedidoFROM PedidoWHERE (YEAR(Fecha_pedido) = 2002) AND

(MONTH(Fecha_pedido) IN (1, 2, 12)) AND(Monto_pedido > 1000) AND(Cod_cliente IN (SELECT cod_cliente FROM cliente

WHERE Ciudad = 'Madison' OR Ciudad = 'Kingston' ANDDireccion_1 IS NOT NULL))

ORDER BY Fecha_pedido, Monto_pedido

Page 2: Guia lab08 bd

Universidad Nacional Jorge Basadre Grohmann /FACIEscuela Académico Profesional de Ingeniería en Informática y SistemasCurso: Bases de Datos y Sistemas Distribuidos Año :IIIPeriodo Académico: 2007

Prof: Ing. Edgar Taya Acosta-http://www.edgartaya.net - [email protected] Pág. 2/11 Ing. Edwin Ramos Velásquez

c) Ahora para ejecutar la consulta. Seleccionar toda la instrucción anterior (Marcarbloque) y luego pulsar la tecla F5. El resultado obtenido será:

Nro_Pedido Fecha_pedido Monto_pedido---------- ------------------------------------------------------ ---------------------20020218 2002-02-18 00:00:00.000 1010.100020020226 2002-02-26 00:00:00.000 4116.600020020227 2002-02-27 00:00:00.000 1529.700020020227 2002-02-27 00:00:00.000 2698.530020021203 2002-12-03 00:00:00.000 1142.130020021203 2002-12-03 00:00:00.000 14872.300020021208 2002-12-08 00:00:00.000 12323.100020021211 2002-12-11 00:00:00.000 2179.8300

(8 filas afectadas)

d) Ahora responda las siguientes preguntas: Consulte a su profesor en caso quetenga dudas.

¿Qué funciones usamos para la consulta, y que permite estas funciones? ¿Qué cláusulas SQL usamos? ¿Qué predicados SQL usamos? ¿Qué operadores usamos? ¿En la consulta es necesario indicar el PAIS?. ¿Por que? En caso de agregar la condición de filtro PAIS ¿como seria el código

SQL?.2.2. Creación de Consultas usando combinación interna de tablas.a) Ejemplo2: Modificar la consulta del Ejemplo1 (las condiciones de filtro son las

mismas), para que ahora muestre la siguiente información: Nro de pedido,nombre del cliente, fecha de pedido (solo mostrar el día y el mes), Nombreproducto, Cantidad, precio y el Importe. Esta información debe estar ordenadapor fecha de pedido y el importe. Para esta consulta puede usar combinacióninterna de tablas y opcionalmente Subconsultas si es necesario (Usar sintaxisANSI SQL-92).

b) La codificación será de la siguiente manera: (Tipear a continuación del resultadodel ejemplo1)

SELECT P.Nro_Pedido, C.Nombre_cliente,Fecha=CAST(DAY(P.Fecha_pedido) as

varchar(2))+'-'+CONVERT(varchar(2),MONTH(P.Fecha_pedido)),PR.Nombre_producto,DP.Cantidad, DP.Precio_por_unidad,Importe = DP.Cantidad * DP.Precio_por_unidad

FROM Pedido PINNER JOIN Cliente C ON P.Cod_cliente = C.Cod_clienteINNER JOIN Detalle_pedido DP ON P.Id_pedido = DP.Id_PedidoINNER JOIN Producto PR ON DP.Cod_producto = PR.Cod_productoWHERE (YEAR(P.Fecha_pedido) = 2002) AND

(MONTH(P.Fecha_pedido) IN (1, 2, 12)) AND(P.Monto_pedido > 1000) AND(C.Ciudad = 'Madison' OR C.Ciudad = 'Kingston' AND C.Direccion_1 IS NOT NULL)

ORDER BY P.Fecha_pedido, Importe

c) Ahora para ejecutar la consulta. Seleccionar toda la instrucción anterior (Marcarbloque) y luego pulsar la tecla F5. El resultado obtenido será:

Page 3: Guia lab08 bd

Universidad Nacional Jorge Basadre Grohmann /FACIEscuela Académico Profesional de Ingeniería en Informática y SistemasCurso: Bases de Datos y Sistemas Distribuidos Año :IIIPeriodo Académico: 2007

Prof: Ing. Edgar Taya Acosta-http://www.edgartaya.net - [email protected] Pág. 3/11 Ing. Edwin Ramos Velásquez

Nro_Pedido Nombre_cliente Fecha Nombre_producto Cantidad Precio_por_unidad Importe---------- -------------------- ----- ------------------------- ----------- -------------------------------20020218 On The Edge Cyclery 18-2 Active Oudoors Lycra Glov 1 16.5000 16.500020020218 On The Edge Cyclery 18-2 Xtreme Youth Helmet 1 33.9000 33.900020020218 On The Edge Cyclery 18-2 Rapel 2 479.8500 959.700020020226 Trail Blazer's Place 26-2 Wheeler 3 539.8500 1619.550020020226 Trail Blazer's Place 26-2 Romeo 3 832.3500 2497.050020020227 Pedals Inc. 27-2 Triumph Pro Helmet 3 37.7100 113.130020020227 Pedals Inc. 27-2 Mini Nicros 3 281.8500 845.550020020227 Pedals Inc. 27-2 SlickRock 2 764.8500 1529.700020020227 Pedals Inc. 27-2 Mozzie 1 1739.8500 1739.850020021203 Pedals Inc. 3-12 Guardian Mini Lock 3 20.8100 62.430020021203 Cyclopath 3-12 Mini Nicros 3 253.6700 761.010020021203 Pedals Inc. 3-12 Wheeler 2 539.8500 1079.700020021203 Cyclopath 3-12 Descent 2 2645.8700 5291.740020021203 Cyclopath 3-12 Descent 3 2939.8500 8819.550020021208 Trail Blazer's Place 8-12 Mini Nicros 2 281.8500 563.700020021208 Trail Blazer's Place 8-12 Descent 1 2939.8500 2939.850020021208 Trail Blazer's Place 8-12 Descent 3 2939.8500 8819.550020021211 Cyclopath 11-12 SlickRock 3 726.6100 2179.8300

(18 filas afectadas)

d) Ahora responda las siguientes preguntas: Consulte a su profesor en caso quetenga dudas.

¿Qué funciones adicionales usamos para la consulta, y que permite estasfunciones?

¿Qué función usaría para mostrar solo las 25 primeras letras de nombrede cliente?

¿Cuántas condiciones de combinación se usan? ¿Cuántas condiciones de filtro existen? ¿Qué nombre de alias de tabla usamos? ¿Cuántas columnas calculadas se crean y como se llaman? ¿Qué paso con la subconsulta? ¿Si las condiciones de filtro son las mismas que el ejemplo1, porqué el

numero de filas retornadas como resultado son diferentes?

2.3. Creación de Consultas usando combinación Externa de tablas.a) Ejemplo3: Realice una consulta que muestre todos los empleados de la

empresa, que no recibieron pedidos. La información que debe retornar es lasiguiente: Código de empleado, Apellidos, Nombres y Cargo. (Usar sintaxisANSI SQL-92).

b) La codificación será de la siguiente manera:Opcion1: Usando subconsultas

Select E.Cod_empleado, E.Apellidos, E.Nombres, E.CargoFROM Empleado Ewhere cod_empleado not in (Select distinct cod_empleado from pedido )

Opcion2: Usando combinación externa

Select E.Cod_empleado, E.Apellidos, E.Nombres, E.Cargofrom empleado ELEFT OUTER JOIN Pedido P ON E.Cod_empleado = P.Cod_EmpleadoWHERE P.Id_Pedido IS NULL

Page 4: Guia lab08 bd

Universidad Nacional Jorge Basadre Grohmann /FACIEscuela Académico Profesional de Ingeniería en Informática y SistemasCurso: Bases de Datos y Sistemas Distribuidos Año :IIIPeriodo Académico: 2007

Prof: Ing. Edgar Taya Acosta-http://www.edgartaya.net - [email protected] Pág. 4/11 Ing. Edwin Ramos Velásquez

c) Ahora para ejecutar la consulta. Seleccionar toda la instrucción anterior (Marcarbloque) y luego pulsar la tecla F5. El resultado obtenido será:Cod_empleado Apellidos Nombres Cargo------------ -------------------- ---------- ------------------------------2 Fuller Andrew Vicepresidente de Ventas5 Buchanan Steven Gerente de Ventas8 Callahan Laura Coordinador Interno de Ventas10 Hellstern Albert Director de Empresa11 Smith Tim Encargado del Correo12 Patterson Caroline Recepcionista13 Brid Justin Director de Marketing14 Martin Xavier Asociado de Marketing15 Pereira Laurent Especialista en Publicidad

(9 filas afectadas)

d) Ahora responda las siguientes preguntas: Consulte a su profesor en caso quetenga dudas.

¿Por qué en la condición de filtro se usa Id_Pedido IS NULL? ¿Una subconsulta es lo mismo que combinación externa?

2.4. Creación de Consultas usando combinación de tablas y funcionesagregadas.a) Ejemplo4: Realice una consulta que muestre el numero total de pedidos que

recibieron los empleados de la empresa, y debe incluir también los empleadosque no recibieron ningún solo pedido. La información que debe retornar es lasiguiente: Nombre del Empleado, Cargo y Total pedidos recibidos. Estainformación debe estar ordenada por Total Pedidos recibidos en formaDescendente. Para esta consulta puede usar combinación interna y/o externa detablas (Usar sintaxis ANSI SQL-92).

b) La codificación será de la siguiente manera:Opcion1:

SELECT E.Nombres, E.Cargo, Total = Count(*)FROM Pedido PINNER JOIN Empleado E ON P.Cod_empleado = E.Cod_empleadoGROUP BY E.Nombres, E.CargoORDER BY 2 DESC

RESULTADO:

Nombres Cargo Total---------- ------------------------------ -----------Robert Representante de Ventas 399Michael Representante de Ventas 372Anne Representante de Ventas 368Nancy Representante de Ventas 360Janet Representante de Ventas 353Margaret Representante de Ventas 340

Opcion2:SELECT E.Nombres, E.Cargo, Total = Count(*)FROM Pedido PRIGHT OUTER JOIN Empleado E ON P.Cod_empleado = E.Cod_empleadoGROUP BY E.Nombres, E.Cargo

Page 5: Guia lab08 bd

Universidad Nacional Jorge Basadre Grohmann /FACIEscuela Académico Profesional de Ingeniería en Informática y SistemasCurso: Bases de Datos y Sistemas Distribuidos Año :IIIPeriodo Académico: 2007

Prof: Ing. Edgar Taya Acosta-http://www.edgartaya.net - [email protected] Pág. 5/11 Ing. Edwin Ramos Velásquez

ORDER BY Total DESC

RESULTADO:

Nombres Cargo Total---------- ------------------------------ -----------Robert Representante de Ventas 399Michael Representante de Ventas 372Anne Representante de Ventas 368Nancy Representante de Ventas 360Janet Representante de Ventas 353Margaret Representante de Ventas 340Andrew Vicepresidente de Ventas 1Xavier Asociado de Marketing 1Laura Coordinador Interno de Ventas 1Albert Director de Empresa 1Justin Director de Marketing 1Tim Encargado del Correo 1Laurent Especialista en Publicidad 1Steven Gerente de Ventas 1Caroline Recepcionista 1

(15 filas afectadas)

Opcion3:SELECT E.Nombres, E.Cargo, Total = Count(P.Cod_Empleado)FROM Pedido PRIGHT OUTER JOIN Empleado E ON P.Cod_empleado = E.Cod_empleadoGROUP BY E.Nombres, E.CargoORDER BY Total desc

RESULTADO:

Nombres Cargo Total---------- ------------------------------ -----------Robert Representante de Ventas 399Michael Representante de Ventas 372Anne Representante de Ventas 368Nancy Representante de Ventas 360Janet Representante de Ventas 353Margaret Representante de Ventas 340Andrew Vicepresidente de Ventas 0Xavier Asociado de Marketing 0Laura Coordinador Interno de Ventas 0Albert Director de Empresa 0Justin Director de Marketing 0Tim Encargado del Correo 0Laurent Especialista en Publicidad 0Steven Gerente de Ventas 0Caroline Recepcionista 0

(15 filas afectadas)

Advertencia: valor NULL eliminado por el agregado u otra operación SET.

c) Ahora responda las siguientes preguntas: Consulte a su profesor en caso quetenga dudas.

¿De las 3 opciones que resultado es correcto?. ¿Por qué? ¿Qué hace la función COUNT() en cada uno de las opciones?

2.5. Creación de Consultas usando múltiples combinaciones externas detablas .

Page 6: Guia lab08 bd

Universidad Nacional Jorge Basadre Grohmann /FACIEscuela Académico Profesional de Ingeniería en Informática y SistemasCurso: Bases de Datos y Sistemas Distribuidos Año :IIIPeriodo Académico: 2007

Prof: Ing. Edgar Taya Acosta-http://www.edgartaya.net - [email protected] Pág. 6/11 Ing. Edwin Ramos Velásquez

a) Ejemplo5: Realice una consulta que muestre todos los empleados de laempresa, que recibieron pedidos y debe incluir también los empleado norecibieron ningún solo pedido. La información que debe retornar es la siguiente:Nro de pedido, nombre del Empleado, Estado del envío del pedido, Nombreproducto. (Usar sintaxis ANSI SQL-92).

b) La codificación será de la siguiente manera:

SELECT P.Nro_Pedido, E.Nombres, P.Enviado,PR.Nombre_producto

FROM Pedido PRIGHT OUTER JOIN Empleado E ON P.Cod_empleado = E.Cod_empleadoLEFT OUTER JOIN Detalle_pedido DP ON P.Id_pedido = DP.Id_PedidoLEFT OUTER JOIN Producto PR ON DP.Cod_producto = PR.Cod_producto

c) Ahora para ejecutar la consulta. Seleccionar toda la instrucción anterior y luegopulsar la tecla F5. El resultado obtenido será:Nro_Pedido Nombres Enviado---------- ---------- ------- -------------------------20021202 Nancy 1 Triumph Pro Helmet20021203 Nancy 1 Descent20021203 Nancy 1 Descent20021203 Nancy 1 Mini Nicros20021228 Nancy 1 Triumph Vertigo Helmet20030102 Nancy 1 Xtreme Adult Helmet20030102 Nancy 1 Xtreme Gellite Mens Saddl20030102 Nancy 1 Descent......20021212 Anne 1 Active Oudoors Crochet Gl20021212 Anne 1 Xtreme Youth HelmetNULL Albert NULL NULLNULL Tim NULL NULLNULL Caroline NULL NULLNULL Justin NULL NULLNULL Xavier NULL NULLNULL Laurent NULL NULL20021203 Nancy 1 Descent20021203 Nancy 1 Descent20021203 Nancy 1 Rapel20021204 Nancy 1 Active Oudoors Crochet Gl......20021228 Nancy 1 Triumph Vertigo Helmet

(3693 filas afectadas)

d) Ahora responda las siguientes preguntas: Consulte a su profesor en caso quetenga dudas.

¿Es correcto el resultado obtenido? ¿Por qué en algunas columnas aparecen el valor NULL? ¿Es lo mismo LEFT OUTER JOIN y RIGHT OUTER JOIN? ¿Para que se usa FULL OUTER JOIN?

2.6. Creación de Consultas usando funciones agregadas SUM, MAX, MIN,AVG.a) Ejemplo6: Realice una consulta que muestre el promedio de montos de pedidos

en cada uno de los meses del año 2003. La información a mostrar es Nombre delmes, Promedio. La información debe estar ordenado por mes (Desde enero adiciembre).

Page 7: Guia lab08 bd

Universidad Nacional Jorge Basadre Grohmann /FACIEscuela Académico Profesional de Ingeniería en Informática y SistemasCurso: Bases de Datos y Sistemas Distribuidos Año :IIIPeriodo Académico: 2007

Prof: Ing. Edgar Taya Acosta-http://www.edgartaya.net - [email protected] Pág. 7/11 Ing. Edwin Ramos Velásquez

b) La codificación será de la siguiente manera:

Select NroMes =DatePart(MM,Fecha_pedido),NombreMes =DATENAME(month,Fecha_pedido),Promedio = AVG(Monto_pedido)

From PedidoWhere Year(Fecha_pedido)=2003Group By DATENAME(month,Fecha_pedido), DatePart(MM,Fecha_pedido)--HAVING AVG(Monto_pedido) > 1800Order by DatePart(MM,Fecha_pedido)

c) Ahora para ejecutar la consulta. Seleccionar toda la instrucción anterior y luegopulsar la tecla F5. El resultado obtenido será:NroMes NombreMes Promedio----------- ------------------------------ ---------------------1 Enero 1663.50472 Febrero 3042.61833 Marzo 1846.61114 Abril 1742.98435 Mayo 1565.81966 Junio 1784.79277 Julio 2548.63198 Agosto 1662.40199 Septiembre 1541.481510 Octubre 1965.298311 Noviembre 1740.146412 Diciembre 1395.2613

d) Ahora responda las siguientes preguntas: Consulte a su profesor en caso quetenga dudas.

¿Qué ocurriría si se ordena por nombre del mes?. ¿Qué permite HAVING? ¿Qué modificación se haría en la consulta si solo se desea mostrar

promedios superiores a 1,800?. ¿Qué modificación tendría que realizar si en vez de promedio se quiere

obtener la SUMA total de pedidos en cada mes del año 2002? ¿Cómo sería una consulta que muestre el monto de pedido máximo y

mínimo de cada mes en el año 2003?e) A partir del siguiente resultado, ¿Cuál seria la consulta? (La consulta se debe

aplicar a pedidos de todos los años)NroMes NombreMes Max_monto_pedido Min_monto_pedido----------- ------------------------------ --------------------- ---------------------1 Enero 12913.8000 9.00002 Febrero 11621.5200 9.00003 Marzo 14741.1500 9.00004 Abril 11867.2000 4.05005 Mayo 14039.1000 9.00006 Junio 15492.3200 13.95007 Julio 17658.8100 14.85008 Agosto 8819.5500 14.50009 Septiembre 11316.6000 8.560010 Octubre 8857.5500 11.310011 Noviembre 10798.9500 9.000012 Diciembre 14872.3000 9.0000

(12 filas afectadas)

2.7. Tipos especiales de combinación de tablas (SELF JOIN).

Page 8: Guia lab08 bd

Universidad Nacional Jorge Basadre Grohmann /FACIEscuela Académico Profesional de Ingeniería en Informática y SistemasCurso: Bases de Datos y Sistemas Distribuidos Año :IIIPeriodo Académico: 2007

Prof: Ing. Edgar Taya Acosta-http://www.edgartaya.net - [email protected] Pág. 8/11 Ing. Edwin Ramos Velásquez

FKReporta_a

EmpleadoCod_empleado: int IDENTITY(1,1)

Apellidos: varchar(20) NOT NULLNombres: varchar(10) NOT NULLCargo: varchar(30) NULLFecha_nacimiento: datetime NULLFecha_contratacion: datetime NULLTfno_particular: varchar(20) NULLExtension: varchar(4) NULLFoto: image NULLNotas: text NULLReporta_a: int NULL (FK)Sueldo: money NULLNro_SS: varchar(12) NULLAFP: varchar(25) NULLDireccion: char(45) NULL

Figura 1a) Ejemplo7: Según la figura 1 un Empleado depende de otro empleado (Reporta

a). Por lo tanto, realice una consulta que muestre Los empleados y loscorrespondientes Jefes a cuales Reporta las actividades realizadas. Lainformación a mostrar es Nombre del Jefe, Cargo Jefe, Nombre del empleado ycargo del empleado

b) La codificación será de la siguiente manera:

Select Jefe.Nombres AS Nombre_Jefe, Jefe.Cargo AS Cargo_jefe, E.Nombres, E.CargoFROM Empleado EINNER JOIN Empleado Jefe ON Jefe.Cod_empleado = E.Reporta_A

c) Ahora para ejecutar la consulta. Seleccionar toda la instrucción anterior y luegopulsar la tecla F5. El resultado obtenido será:Nombre_Jefe Cargo_jefe Nombres Cargo----------- ------------------------------ ---------- ------------------------------Andrew Vicepresidente de Ventas Nancy Representante de VentasAndrew Vicepresidente de Ventas Janet Representante de VentasAndrew Vicepresidente de Ventas Margaret Representante de VentasAndrew Vicepresidente de Ventas Steven Gerente de VentasSteven Gerente de Ventas Michael Representante de VentasSteven Gerente de Ventas Robert Representante de VentasAndrew Vicepresidente de Ventas Laura Coordinador Interno de VentasSteven Gerente de Ventas Anne Representante de VentasAndrew Vicepresidente de Ventas Albert Director de EmpresaJanet Representante de Ventas Tim Encargado del CorreoJanet Representante de Ventas Caroline RecepcionistaAndrew Vicepresidente de Ventas Justin Director de MarketingJustin Director de Marketing Xavier Asociado de Marketing

(13 filas afectadas)

d) Ahora responda las siguientes preguntas: Consulte a su profesor en caso quetenga dudas.

¿Por qué se hace referencia a misma tabla 2 veces, es decir una tabla secombina con ella misma?

¿Habría otra forma de realizar la misma consulta y obtener un resultadosimilar?

2.8. Combinación de Tablas, SubConsultas y Funciones Agregadas

Page 9: Guia lab08 bd

Universidad Nacional Jorge Basadre Grohmann /FACIEscuela Académico Profesional de Ingeniería en Informática y SistemasCurso: Bases de Datos y Sistemas Distribuidos Año :IIIPeriodo Académico: 2007

Prof: Ing. Edgar Taya Acosta-http://www.edgartaya.net - [email protected] Pág. 9/11 Ing. Edwin Ramos Velásquez

Detalle_pedidoID_pedido: intCod_producto: int

Precio_por_unidad: moneyCantidad: int

ProductoCod_producto: int

Nombre_producto: varchar(50)Color: varchar(20)Tamaño: varchar(10)Publico_objetivo: varchar(10)Precio: moneyCod_proveedor: intCod_Tipo_Producto: intClase_producto: varchar(50)

Tipo_productoCod_Tipo_Producto: int

Nombre_tipo_producto: varchar(50)Descripcion: textImagen: image

Figura 2a) Ejemplo8: El gerente de Ventas STEVEN esta en uno de sus días de malas, y

ha prometido a despedir al primer empleado que no sea eficiente en su trabajo, yjusto en este momento ve a XAVIER (Asociado de marketing) y para hacerlesudar la gota gorda le encarga obtener la siguiente información: Obtener elnombre del tipo de producto que genera mayores porcentajes de ingresos a laempresa según los pedidos recibidos. Xavier como buen marketero no sabenada de computación y para no perder su trabajo busca a un amigo que leresuelva el problema, y justamente TU eres el amigo que busca. ¿Podrásayudarle?

b) ¿La siguiente codificación será correcto y talvez sea lo que necesitas?: (Paraayudarte vea la figura 2)

SELECT tp.Nombre_tipo_producto,SUM(DP.Cantidad * DP.Precio_por_unidad ) AS TotalMontoPedido,CAST(SUM(DP.Cantidad * DP.Precio_por_unidad) /

(Select SUM(DP2.Cantidad * DP2.Precio_por_unidad)From Detalle_pedido DP2 ) * 100 as DECIMAL(6,2))

AS PorcentageDelTotalPedidosFROM Detalle_pedido DP

JOIN Producto PR ON DP.Cod_producto = PR.Cod_productoJOIN Tipo_Producto TP ON PR.Cod_tipo_producto = TP.Cod_tipo_producto

GROUP BY tp.Nombre_tipo_productoORDER BY 3 DESC

c) Ahora para ejecutar la consulta. Seleccionar toda la instrucción anterior y luegopulsar la tecla F5. El resultado será:Nombre_tipo_producto TotalMontoPedido PorcentageDelTotalPedidos-------------------------------------------------- ----------------------------------------------Competición 2800861.5300 68.58Montaña 710623.3600 17.40Funcional 385733.3600 9.44Infantil 76390.1500 1.87Cascos 70251.8400 1.72Guantes 17402.7100 .42Sillines 13680.8600 .33Candados 8721.5300 .21

Page 10: Guia lab08 bd

Universidad Nacional Jorge Basadre Grohmann /FACIEscuela Académico Profesional de Ingeniería en Informática y SistemasCurso: Bases de Datos y Sistemas Distribuidos Año :IIIPeriodo Académico: 2007

Prof: Ing. Edgar Taya Acosta-http://www.edgartaya.net - [email protected] Pág. 10/11 Ing. Edwin Ramos Velásquez

d) Ahora responda las siguientes preguntas: Consulte a su profesor en caso quetenga dudas.

¿Xavier perderá su trabajo? ¿Entiendes lo que has hecho, es decir, es entendible del código de la

consulta?. ¿Qué tipo de combinación estamos usando, si solo se pone JOIN ?

e) Xavier muy alegre se dirige a la oficina del Gerente de Ventas, el cual sesorprende por los resultados. Orgulloso de su trabajador le da otro encarguito,ahora el gran Jefe quiere saber en que mes genera mayores porcentajes deingresos a la empresa el tipo de producto "Competición", según los pedidosrecibidos y además le ordena que coordine con JUSTIN (Director de Marketing)para hacer mayor publicidad en los meses donde hay pocos pedidos del tipo deproducto "Competición".

¿Qué hará Xavier ? ¿Podrías ayudarle o crees que aquí hay bronca? ¿En que meses recomendará hacer mayor publicidad XAVIER ó

renuncia?

2.9. Unión de Tablasa) Ejemplo9: Obtener los 3 pedidos mas antiguos y los 2 últimos pedidos. Ordenar

por fecha de pedido el resultado final.

b) La codificación será de la siguiente manera:

SET NOCOUNT ONSelect top 3 ID_pedido, Nro_Pedido, Fecha_pedido, Cod_cliente, Monto_pedido

Into #Pedidos1From PedidoOrder By Fecha_pedido ASC

Select top 2 ID_pedido, Nro_Pedido, Fecha_pedido, Cod_cliente, Monto_pedidoInto #Pedidos2From PedidoOrder By Fecha_pedido DESC

--SET NOCOUNT OFFSelect * From #Pedidos1

Union ALLSelect * From #Pedidos2

Order By #Pedidos1.Fecha_pedido ASC

DROP TABLE #Pedidos1DROP TABLE #Pedidos2

c) Ahora para ejecutar la consulta. Seleccionar toda la instrucción anterior y luegopulsar la tecla F5. El resultado obtenido será:ID_pedido Nro_Pedido Fecha_pedido Cod_cliente Monto_pedido----------- ---------- ---------------------------------- --------------------------------1303 20020218 2002-02-18 00:00:00.000 2 1505.10001305 20020218 2002-02-18 00:00:00.000 56 1010.10001310 20020219 2002-02-19 00:00:00.000 30 58.00002997 20040502 2004-05-02 00:00:00.000 66 43.50002998 20040502 2004-05-02 00:00:00.000 77 1082.5000

Page 11: Guia lab08 bd

Universidad Nacional Jorge Basadre Grohmann /FACIEscuela Académico Profesional de Ingeniería en Informática y SistemasCurso: Bases de Datos y Sistemas Distribuidos Año :IIIPeriodo Académico: 2007

Prof: Ing. Edgar Taya Acosta-http://www.edgartaya.net - [email protected] Pág. 11/11 Ing. Edwin Ramos Velásquez

d) Ahora responda las siguientes preguntas: Consulte a su profesor en caso quetenga dudas.

¿Por qué se usa el símbolo #? ¿Dónde se crean las tablas #Pedidos1 y #Pedidos2 ? ¿Qué realiza SET NOCOUNT ON/OFF?

2.10. Por último guardar todo y finalizamos la presente práctica.

Información AdicionalQue realiza la siguiente consulta

Select NroMes =DatePart(MM,Fecha_pedido),NombreMes =DATENAME(month,Fecha_pedido),Max_monto_pedido = MAX(Monto_pedido),Min_monto_pedido = MIN(Monto_pedido)

From PedidoWhere DatePart(yy, Fecha_pedido)=2003Group By DATENAME(month,Fecha_pedido), DatePart(MM,Fecha_pedido)Order by DatePart(MM,Fecha_pedido)

Que realiza la siguiente consulta

SELECT NombreMes=DATENAME(month,P.Fecha_pedido),SUM(DP.Cantidad * DP.Precio_por_unidad ) AS TotalMontoPedido,CAST(SUM(DP.Cantidad * DP.Precio_por_unidad) /

(Select SUM(DP2.Cantidad * DP2.Precio_por_unidad)From Detalle_pedido DP2 ) * 100 as DECIMAL(6,2))

AS PorcentageDelTotalPedidosFROM Detalle_pedido DP

JOIN Producto PR ON DP.Cod_producto = PR.Cod_productoJOIN Tipo_Producto TP ON PR.Cod_tipo_producto = TP.Cod_tipo_productoJOIN Pedido P ON DP.Id_pedido = P.Id_pedido

WHERE tp.Nombre_tipo_producto = 'Competición'GROUP BY DATENAME(month,P.Fecha_pedido)ORDER BY 3 DESC

Tacna, Noviembre del 2006