Cita:
Iniciado por d4ri0 Sino creo que no sirve de nada tener otra tabla más con los datos duplicados.
Se llaman vistas y se pueden programar directamente en el DBMS. Su uso es esotérico, por no encontrar una mejor palabra.
Suponiendo que tenemos los siguientes datasets
Código:
mysql> SELECT * FROM llamadas;
+-----------+-----------+----------+
| idcliente | discado | duracion |
+-----------+-----------+----------+
| 1 | 005113349 | 70 |
| 1 | 005121122 | 50 |
| 1 | 005121123 | 40 |
| 2 | 005132321 | 90 |
| 2 | 005123344 | 120 |
| 3 | 005123411 | 40 |
+-----------+-----------+----------+
Código:
mysql> SELECT * FROM tarifas;
+---------+---------+-------+
| prefijo | destino | valor |
+---------+---------+-------+
| 00511 | Lima | 5 |
| 00512 | Bagua | 7 |
| 00513 | Bolivar | 3 |
+---------+---------+-------+
Procedemos a crear una vista que muestre el cliente, el número discado, la provincia de destino y la duración y valor de la llamada. Empezamos armando el select que va a utilizar la vista
Código:
mysql> SELECT idcliente, discado, destino, duracion, (duracion * valor) AS costo FROM llamadas LEFT JOIN tarifas ON LEFT(discado, LENGTH(prefijo)) = prefijo ORDER BY idcliente;
+-----------+-----------+---------+----------+-------+
| idcliente | discado | destino | duracion | costo |
+-----------+-----------+---------+----------+-------+
| 1 | 005113349 | Lima | 70 | 350 |
| 1 | 005121122 | Bagua | 50 | 350 |
| 1 | 005121123 | Bagua | 40 | 280 |
| 2 | 005123344 | Bagua | 120 | 840 |
| 2 | 005132321 | Bolivar | 90 | 270 |
| 3 | 005123411 | Bagua | 40 | 280 |
+-----------+-----------+---------+----------+-------+
Luego creamos la vista con esa consulta
Código:
CREATE VIEW reporte AS SELECT idcliente, discado, destino, duracion, (duracion * valor) AS costo FROM llamadas LEFT JOIN tarifas ON LEFT(discado, LENGTH(prefijo)) = prefijo ORDER BY idcliente;
Y procedemos a ver qué resulta
Código:
mysql> SELECT * FROM reporte;
+-----------+-----------+---------+----------+-------+
| idcliente | discado | destino | duracion | costo |
+-----------+-----------+---------+----------+-------+
| 1 | 005113349 | Lima | 70 | 350 |
| 1 | 005121122 | Bagua | 50 | 350 |
| 1 | 005121123 | Bagua | 40 | 280 |
| 2 | 005123344 | Bagua | 120 | 840 |
| 2 | 005132321 | Bolivar | 90 | 270 |
| 3 | 005123411 | Bagua | 40 | 280 |
+-----------+-----------+---------+----------+-------+
Esto nos sirve para calcular al vuelo, por ejemplo, cuanto tarifar a un cliente
Código:
mysql> SELECT idcliente, SUM(costo) FROM reporte GROUP BY idcliente;
+-----------+------------+
| idcliente | SUM(costo) |
+-----------+------------+
| 1 | 980 |
| 2 | 1110 |
| 3 | 280 |
+-----------+------------+