Ver Mensaje Individual
  #6 (permalink)  
Antiguo 20/12/2014, 19:51
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: insertar datos en dos tablas y realizar calculos

Bueno, convertir esa trama de datos en una entrada a la otra tabla requiere de usar funciones de cadena para eso. Usualmente te aconsejaría que modificases el proceso que inserta los datos, para que ya ingresen desde origen normalizados. Hacer esto en SQL es algo poco performante.
Ahora bien, asumiendo que no puedes modificarlo, sólo resta crear la query que lo divida. Para eso se usa SUBSTRING_INDEX(), de este modo:
Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->  TRIM(SUBSTRING_INDEX('00E +3189915 +0007180 +0008288 +0455 C+1111', '+', 1)) valor1,
  3.     ->  CAST(TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX('00E +3189915 +0007180 +0008288 +0455 C+1111', '+', 2),'+', -1)) AS UNSIGNED)*2 valor2,
  4.     ->  CAST(TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX('00E +3189915 +0007180 +0008288 +0455 C+1111', '+', 3),'+', -1)) AS UNSIGNED)/100 valor3,
  5.     ->  CAST(TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX('00E +3189915 +0007180 +0008288 +0455 C+1111', '+', 4),'+', -1)) AS UNSIGNED)/1000 valor4,
  6.     ->  TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX('00E +3189915 +0007180 +0008288 +0455 C+1111', '+', 5),'+', -1)) valor5,
  7.     ->  TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX('00E +3189915 +0007180 +0008288 +0455 C+1111', '+', 6),'+', -1)) valor6
  8.     -> ;
  9. +--------+---------+---------+--------+--------+--------+
  10. | valor1 | valor2  | valor3  | valor4 | valor5 | valor6 |
  11. +--------+---------+---------+--------+--------+--------+
  12. | 00E    | 6379830 | 71.8000 | 8.2880 | 0455 C | 1111   |
  13. +--------+---------+---------+--------+--------+--------+
  14. 1 row in set (0.00 sec)
  15.  
  16. mysql>
Usando algo así se puede crear un insert hacia la segunda tabla con sólo hacer un INSERT... SELECT, como este:
Código MySQL:
Ver original
  1. INSERT INTO tabla(inicio_trama, saldo, voltaje, bateria, codigo_sucursal, fin_trama)
  2.     TRIM(SUBSTRING_INDEX(datos, 1)),
  3.     (CAST(TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(datos, '+', 2),'+', -1)) AS UNSIGNED) * 2),
  4.     (CAST(TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(datos, '+', 3),'+', -1)) AS UNSIGNED)/100),
  5.     (CAST(TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(datos, '+', 4),'+', -1)) AS UNSIGNED)/1000),
  6.     TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(datos, '+', 5),'+', -1)),
  7.     TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(datos, '+', 6),'+', -1))
  8. FROM TABLA;
Esto se podría hacer en un SP, e incluso sería posible en un TRIGGER, pero este segundo caso no es muy perfomante para tu escenario así que te recomiendo no usarlo.
El SP se puede invocar por EVENT para que corra sólo, o bien meter la query en un EVENT, con las condiciones necesarias.
Habría que ver qué condiciones debe cumplir para no duplicar los registros.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)