Translate

Ejercicios

Para poner en práctica algunas de las sentencias básicas y entender mejor su uso, vamos a resolver los siguientes ejercicios.
Para descargar el script completo con los ejercicios dar clic aquí:

                           https://www.dropbox.com/s/19l2jcambm1tvt7/ejercicios.sql

--1.  Actualizar el precio unitario de los productos de la categoría CARNICOS, subiéndolos en un 10%
    --COMO SE VEN LOS CAMPOS ANTES DE LA ACTUALIZACION
    SELECT PRECIOUNIT AS PRECIO_ANTERIOR,NOMBRECAT AS CATEGORIA
    FROM CATEGORIAS C INNER JOIN PRODUCTOS P
    ON (C.CATEGORIAID=P.CATEGORIAID)
    WHERE NOMBRECAT='CARNICOS'
    --ACTUALIZANDO LA TABLA
        UPDATE PRODUCTOS SET PRECIOUNIT=PRODUCTOS.PRECIOUNIT*1.1
        FROM CATEGORIAS C INNER JOIN PRODUCTOS P
        ON (C.CATEGORIAID=P.CATEGORIAID)
        WHERE NOMBRECAT='CARNICOS'
    --COMO SE VEN LOS CAMPOS DESPUES DE LA ACTUALIZACION
    SELECT PRECIOUNIT AS PRECIO_NUEVO,NOMBRECAT AS CATEGORIA
    FROM CATEGORIAS C INNER JOIN PRODUCTOS P
    ON (C.CATEGORIAID=P.CATEGORIAID)
    WHERE NOMBRECAT='CARNICOS'


Antes
Después












--2.  Actualizar el teléfono celular del proveedor cuyo contacto es MANUEL ANDRADE, con el valor 099010291
    --COMO SE VEN LOS CAMPOS ANTES DE LA ACTUALIZACION
    SELECT CELUPROV AS CELULAR_ANTERIOR, CONTACTO
    FROM PROVEEDORES
    WHERE CONTACTO='MANUEL ANDRADE'
    --ACTUALIZANDO LA TABLA
        UPDATE PROVEEDORES SET CELUPROV='099234567'
        WHERE CONTACTO='MANUEL ANDRADE'
    --COMO SE VEN LOS CAMPOS DESPUES DE LA ACTUALIZACION
    SELECT CELUPROV AS CELULAR_NUEVO, CONTACTO
    FROM PROVEEDORES
    WHERE CONTACTO='MANUEL ANDRADE'

Antes
Después










--3.  Borrar el producto YOGURT DE SABORES
    --COMO SE VE LA TABLA ANTES DEL BORRADO
    SELECT * FROM PRODUCTOS
    --BORRANDO EL REGISTRO
    DELETE FROM PRODUCTOS WHERE DESCRIPCION='YOGURT DE SABORES'
     
    --COMO SE VE LA TABLA DESPUES DEL BORRADO
    SELECT * FROM PRODUCTOS
Antes
Después



















--4. REALIZAR LAS SIGUIENTES CONSULTAS
--4.1 Mostrar todas las órdenes: el id de la orden, el apellido y nombre del empleado que la atendió
--el nombre de la compañía cliente y la fecha de orden
--IMPORTANTE PARA CONCATENAR SE USA  ||
SELECT ORDENID, APELLIDO|| ' ' ||NOMBRE AS EMPLEADO,NOMBRECIA, FECHAORDEN
FROM EMPLEADOS E INNER JOIN ORDENES O
ON(E.EMPLEADOID=O.EMPLEADOID)
INNER JOIN CLIENTES C
ON(O.CLIENTEID=C.CLIENTEID)


--4.2 Mostrar la suma total de cada tipo de producto pedidos en todas las órdenes

SELECT SUM(CANTIDAD) AS CANTIDAD,NOMBRECAT

FROM DETALLE_ORDENES D INNER JOIN PRODUCTOS P

ON(D.PRODUCTOID=P.PRODUCTOID)
INNER JOIN CATEGORIAS C
ON(C.CATEGORIAID=P.CATEGORIAID)
GROUP BY NOMBRECAT

--4.3 Mostrar el número de órdenes atendidas por cada empleado, incluidos los que tienen 0 órdenes.
SELECT COUNT(ORDENID) AS NUMERO_DE_ORDENES,APELLIDO|| ' ' ||NOMBRE AS EMPLEADO
FROM ORDENES O RIGHT JOIN EMPLEADOS E
ON(O.EMPLEADOID=E.EMPLEADOID)
GROUP BY (APELLIDO|| ' ' ||NOMBRE)
ORDER BY NUMERO_DE_ORDENES,EMPLEADO


--4.4 Muestre los proveedores y la suma de dinero vendido en los productos de ese proveedor.
SELECT NOMBREPROV AS PROVEEDOR, SUM(PRECIOUNIT*CANTIDAD) AS VENTA_TOTAL
FROM PROVEEDORES P JOIN PRODUCTOS PR
ON(P.PROVEEDORID=PR.PROVEEDORID)
JOIN DETALLE_ORDENES D
ON(D.PRODUCTOID=PR.PRODUCTOID)
GROUP BY NOMBREPROV


--5. Realizar el siguiente procedimiento almacenado.
--5.1 Escriba un procedimiento almacenado que reciba como parámetro un código de proveedor y
--    devuelve el número de órdenes en las que están incluidos productos de ese proveedor.
CREATE OR REPLACE FUNCTION numero_ordenes(INTEGER)
RETURNS INTEGER AS $$
    DECLARE CODIGO INTEGER;
        NUMORDEN INTEGER;
        FILA_ITEM DETALLE_ORDENES%ROWTYPE;
    BEGIN
        CODIGO:=$1;
        NUMORDEN:=0;
        FOR FILA_ITEM IN SELECT P.PRODUCTOID
                    FROM  PRODUCTOS P JOIN DETALLE_ORDENES D
                    ON(P.PRODUCTOID=D.PRODUCTOID)
                WHERE CODIGO=P.PROVEEDORID
                LOOP
                    NUMORDEN:=NUMORDEN+1;
                END LOOP;
        RETURN NUMORDEN;
    END;
$$LANGUAGE 'plpgsql';
SELECT NUMERO_ORDENES(10);

--5.2 Escriba un procedimiento almacenado que reciba como parámetro un nombre de una categoría y
--    devuelve el código del producto de esa categoría que tiene más unidades vendidas.
CREATE OR REPLACE FUNCTION max_vendidas(CHAR(16))
RETURNS INTEGER AS $$
    DECLARE NOMBRE CHAR(16);
        MAXIMO INTEGER;
        CODIGO INTEGER;
    BEGIN
        NOMBRE:=$1;
        SELECT INTO MAXIMO MAX(CANTIDAD) FROM DETALLE_ORDENES D JOIN PRODUCTOS P
                               ON(D.PRODUCTOID=P.PRODUCTOID)
                               JOIN CATEGORIAS C
                               ON(C.CATEGORIAID=P.CATEGORIAID)
                               WHERE NOMBRECAT=NOMBRE;
                                
        SELECT INTO CODIGO D.PRODUCTOID FROM (CATEGORIAS C INNER JOIN PRODUCTOS P
                               ON(C.CATEGORIAID=P.CATEGORIAID)
                               JOIN DETALLE_ORDENES D
                               ON(D.PRODUCTOID=P.PRODUCTOID))
                               WHERE D.CANTIDAD= MAXIMO AND NOMBRECAT=NOMBRE;
        RETURN CODIGO;
    END;
     
$$LANGUAGE 'plpgsql';
SELECT MAX_VENDIDAS('LACTEOS');


2 comentarios: