Ejercicio Integrador - Recaudación
A modo de integración se propone crear las consultas necesarias para calcular los montos de recaudación descritos en la base de datos NorthWind.
Se eligen los siguientes criterios:
- Por recaudación según cada producto.
- Por recaudación según cada empleado de la tienda.
1. Tablas relevantes
Se describen las tablas de la base de datos que tienen información importante para los ejercicios y se enumeran los campos de interés de cada una.
Orders
Hay 196 órdenes de compra en total, las cuales pueden agrupar distintos productos (no especificados aquí) y cada una es manejada por un empleado particular.
OrderDetails
Las órdenes se desglosan en 518 "detalles de orden". Cada uno consiste en un producto elegido para comprar y su cantidad pedida.
Products
El catálogo de productos (77 en total) tiene su propia tabla, donde se incluye el nombre y precios de cada uno.
Employees
Los datos de todos los empleados son condensados en esta tabla. Son 10 personas contratadas.
2. Agrupar detalles de órdenes
Se extiende la tabla OrderDetails
agregando los precios de cada producto elegido mediante una unión INNER JOIN
y se crea una vista de dicha consulta,
llamándola OrderDetailsExtended
:
-- Creación de vista
CREATE VIEW IF NOT EXISTS OrderDetailsExtended AS
-- inner join implicita
SELECT OrderDetailID,
OrderID,
P.ProductID,
Quantity,
Price ,
Quantity * Price AS ProductOrderRevenue
FROM OrderDetails OD, Products P
WHERE OD.ProductID=P.ProductID
Esta vista puede consultarse como una tabla cualquiera:
OrderDetailID | OrderID | ProductID | Quantity | Price | ProductOrderRevenue |
---|---|---|---|---|---|
1 | 10248 | 11 | 12 | 21 | 252 |
2 | 10248 | 42 | 10 | 14 | 140 |
3 | 10248 | 72 | 5 | 34.8 | 174.0 |
... | ... | ... | ... | ... | ... |
517 | 10443 | 11 | 6 | 21 | 126 |
518 | 10443 | 28 | 12 | 45.6 | 547.2 |
3. Recaudación por producto
Con una consulta se calcula el total de dinero recaudado con cada producto en venta
y se le asigna la lista ProductsRevenue
.
Usa los datos de la vista OrderDetailsExtended
y le agrega el nombre de cada producto mediante una unión LEFT JOIN
CREATE VIEW IF NOT EXISTS ProductsRevenue AS
SELECT
P.ProductID,
ProductName,
SUM(ProductOrderRevenue) AS ProductRevenue
FROM Products P
LEFT JOIN OrderDetailsExtended ODE
ON P.ProductID=ODE.ProductID
GROUP BY P.ProductID
ProductID | ProductName | ProductRevenue |
---|---|---|
1 | Chais | 2862 |
2 | Chang | 6479 |
3 | Aniseed Syrup | 800 |
4 | Chef Anton's Cajun Seasoning | 2354 |
... | ... | ... |
76 | Lakkalikööri | 3564 |
77 | Original Frankfurter grüne Soße | 1404 |
4. Recaudación por empleado
La vista OrderDetailsExtended
se une con la tabla Orders
.
Esto permitirá agregar la información de los empleados
y se usa la agregación para calcular los totales de ingresos correspondientes a cada empleado,
creando la vista EmployeesSales
:
-- Creación de vista
CREATE VIEW IF NOT EXISTS EmployeesSales AS
SELECT
-- ID de cada empleado con ingresos
EmployeeID,
-- suma por ventas de cada empleado
SUM(ProductOrderRevenue) AS EmployeeSales
-- inner join implicita
FROM OrderDetailsExtended ODE, Orders O
WHERE ODE.OrderID=O.OrderID
-- agregacion por ID de empleado empleado
GROUP BY EmployeeID
ORDER BY EmployeeID
EmployeeID | EmployeeSales |
---|---|
1 | 57690.39 |
2 | 32503.16 |
3 | 42838.35 |
4 | 105696.5 |
5 | 27480.8 |
6 | 25399.25 |
7 | 39772.3 |
8 | 39309.38 |
9 | 15734.1 |
Con una LEFT JOIN
se puede forzar la visualización de todos los empleados
y a cada uno se le asigna el valor de ventas conseguido:
-- Creación de vista
CREATE VIEW IF NOT EXISTS EmployeesRevenue AS
SELECT
E.EmployeeID,
FirstName ||" "||LastName AS Employee,
EmployeeSales
FROM Employees E
-- se muestra a todos los empleados
LEFT JOIN EmployeesSales S
ON S.EmployeeID=E.EmployeeID
ORDER BY E.EmployeeID
La vista creada se llamó EmployeesRevenue
y se consulta para ver el resultado
EmployeeID | Employee | EmployeeSales |
---|---|---|
1 | Nancy Davolio | 57690.39 |
2 | Andrew Fuller | 32503.16 |
3 | Janet Leverling | 42838.35 |
4 | Margaret Peacock | 105696.5 |
5 | Steven Buchanan | 27480.8 |
6 | Michael Suyama | 25399.25 |
7 | Robert King | 39772.3 |
8 | Laura Callahan | 39309.38 |
9 | Anne Dodsworth | 15734.1 |
10 | Adam West |
5. Conexion con Python
Descarga de rutina Python "recaudar.py"
Ver código de rutina Python
recaudar.py | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 |
|