Ver Mensaje Individual
  #11 (permalink)  
Antiguo 19/12/2012, 03:14
alyciashape
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años
Puntos: 58
Respuesta: Operaciones usando los ALIAS

Perdona. Si quiero eso por artículo, no para uno en concreto, sino para todos.

Esta es la consulta que me da al editar la vista. Lo modifica todo al parecer y es un caos enterarse de nada, lo peor son los paréntesis que mete. ¿Es normal?
Código MySQL:
Ver original
  1. select `a`.`claart` AS `claart`,`a`.`codigo` AS `codigo`,`a`.`nombre` AS `nombre`,`a`.`s_alm_temp_vigo` AS `s_alm_temp_vigo`,`a`.`s_perdidas` AS `s_perdidas`,`a`.`s_dot` AS `s_dot`,
  2. (((`a`.`s_urbarrio` + `a`.`s_dresden`) + `a`.`s_consignia`) + `a`.`s_alcabre_urba`) AS `Urbarrio`,(`a`.`s_alcabre_moto` + `a`.`s_motoexpress`) AS `Motoexpress`,
  3. (((((((((`a`.`s_alm_temp_vigo` + `a`.`s_urbarrio`) + `a`.`s_alm_temp_camion`) + `a`.`s_dresden`) + `a`.`s_consignia`) + `a`.`s_alcabre_moto`) + `a`.`s_motoexpress`) + `a`.`s_perdidas`) + `a`.`s_alcabre_urba`) + `a`.`s_dot`) AS `Total`,
  4. sum(if((`c`.`claemp` = 2),`c`.`cantidad`,0)) AS `Compras Urbarrio`,
  5. sum(if((`c`.`claemp` = 5),`c`.`cantidad`,0)) AS `Compras Motoexpress`,sum(if((`c`.`claemp` = 0),`c`.`cantidad`,0)) AS `Compras Otros`,
  6. sum(`c`.`cantidad`) AS `Total Compras`
  7. from (`articulo` `a` join `compra` `c` on((`a`.`claart` = `c`.`claart`)))
  8. group by `a`.`claart`

Tras tirarme un buen rato arreglándolo así es como la puse yo en realidad:
Código MySQL:
Ver original
  1. SELECT a.claart, a.codigo, a.nombre, a.s_alm_temp_vigo, a.s_perdidas, a.s_dot, (a.s_urbarrio+a.s_dresden+a.s_consignia+a.s_alcabre_urba) 'Urbarrio', (a.s_alcabre_moto+a.s_motoexpress) 'Motoexpress', (a.s_alm_temp_vigo+a.s_urbarrio+a.s_alm_temp_camion+a.s_dresden+a.s_consignia+a.s_alcabre_moto+a.s_motoexpress+a.s_perdidas+a.s_alcabre_urba+a.s_dot) 'Total',
  2. SUM(IF(claemp=2, cantidad, 0)) 'Compras Urbarrio',
  3. SUM(IF(claemp=5, cantidad, 0)) 'Compras Motoexpress',
  4. SUM(IF(claemp=0, cantidad, 0)) 'Compras Otros',
  5. SUM(cantidad) 'Compras Total',
  6. FORMAT(AVG(c.media), 2) 'Media'
  7. FROM articulo a INNER JOIN compra c ON (a.claart=c.claart)
  8. WHERE c.fecha = MAX(c.fecha)
  9. GROUP BY a.claart

Exceptuando que ahora puse el campo media y el WHERE con la fecha. Algo que antes no me daba cuenta pero está mal.

El tema es que yo en la tabla compras, ejecutando un script, calculo todos los campos a fecha actual (en un DATETIME) y guardo en la tabla compra con la fecha y datos por artículo y por empresa.

Es decir que en compras por cada artículo tengo 3 registros que quiero recoger, que además serían los que tengan la última fecha. Todos tienen la misma. En el citado script capto la fecha y la uso para todos los insert así que es idéntica para todos los que quiero recoger. Por ejemplo:

Si paso el script ahora me guardaria en la fecha
2012-12-19 10:07:20 3 registros por cada artículo guardando las compras y otros datos y a que empresa pertenecen.

Tal y como tengo la consulta no funciona, me dice que el group by ahí no tiene cabida. Sin el WHERE funciona pero claro, me coge todas las fechas.

Además todavía me queda hacer otra tabla para las ventas y puede que una más para movimientos. Espero que tenga bien planteado el sistema.

De momento lo solucioné así:
Código MySQL:
Ver original
  1. WHERE c.fecha = (SELECT MAX(fecha) FROM compra)
  2. GROUP BY a.claart

Pero por lo que me decías prefería evitar subconsultas.

Además, pensando en más adelante, cuando añada la tabla venta que tendrá otra fecha diferente no se si me servirá. Son tablas donde meto datos por scripts y tardan mucho en realizarse pues hay muchos datos, así que tendrán fechas diferentes si o si. No se si con un compra.fecha = (SELECT MAX(fecha) FROM compra) y un venta.fecha = (SELECT MAX(fecha) FROM venta) funcionaría como espero.


Una cosa más, perdona por marearte tanto, ahora que añadí ventas el tiempo de ejecución pasa de 1 segundo de antes a 40 segundos, porque añadí una nueva tabla. Sospecho que esta no es la manera correcta de realizar el INNER JOIN con 3 tablas teniendo una en común.
Código MySQL:
Ver original
  1. SELECT a.claart, a.codigo, a.nombre, a.s_alm_temp_vigo, a.s_perdidas, a.s_dot, (a.s_urbarrio+a.s_dresden+a.s_consignia+a.s_alcabre_urba) 'Urbarrio', (a.s_alcabre_moto+a.s_motoexpress) 'Motoexpress', (a.s_alm_temp_vigo+a.s_urbarrio+a.s_alm_temp_camion+a.s_dresden+a.s_consignia+a.s_alcabre_moto+a.s_motoexpress+a.s_perdidas+a.s_alcabre_urba+a.s_dot) 'Total',
  2. SUM(IF(c.claemp=2, c.cantidad, 0)) 'Compras Urbarrio',
  3. SUM(IF(c.claemp=5, c.cantidad, 0)) 'Compras Motoexpress',
  4. SUM(IF(c.claemp=0, c.cantidad, 0)) 'Compras Otros',
  5. SUM(c.cantidad) 'Compras Total',
  6. FORMAT(AVG(c.media), 2) 'MediaC',
  7. SUM(IF(v.claemp=2, v.cantidad, 0)) 'Ventas Urbarrio',
  8. SUM(IF(v.claemp=5, v.cantidad, 0)) 'Ventas Motoexpress',
  9. SUM(IF(v.claemp=0, v.cantidad, 0)) 'Ventas Otros',
  10. SUM(v.cantidad) 'Ventas Total',
  11. FORMAT(AVG(v.media), 2) 'MediaV'
  12. FROM venta v INNER JOIN  articulo a ON (a.claart=v.claart)
  13. INNER JOIN compra c ON (a.claart=c.claart)
  14. WHERE c.fecha = (SELECT MAX(fecha) FROM compra)
  15. GROUP BY a.claart

He probado con USING en lugar de ON, con WHERE campo=campo2 y nada. No bajo de los 40 segundos.

¿Podría tener que ver conque claart es la clave primaria de articulo pero no es ni primaria ni foránea en las otras tablas?

Otra edición:
Añadí índices a los claart y de los 40 segundos que tardaba antes ahora tarda 0,07 segundos. Vaya cambio!
Sin embargo desde entonces me aparece aleatoriamente este error:
Código error:
Ver original
  1. Fatal error: Maximum execution time of 30 seconds exceeded in C:\xampp_new\phpmyadmin\libraries\session.inc.php on line 96

Quité los índices que había creado y también la vista y me sigue dando ese error. Reinicié apache y mysql y sigue igual.

Cuanto se aprende con estas bases de datos grandecitas. Y eso que esta no es demasiado grande.

Última edición por alyciashape; 19/12/2012 a las 10:57