Ver Mensaje Individual
  #9 (permalink)  
Antiguo 28/01/2010, 00:55
jurena
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Ayuda con esta consulta

Bastará, creo, con añadir id_articulo DESC.

Código SQL:
Ver original
  1. UPDATE activos INNER JOIN
  2.  (SELECT t1.id_articulo, t1.id_requisicion, t1.unidad, t1.descripcion, t1.cantidad FROM
  3.        (SELECT id_articulo, id_requisicion, unidad, descripcion, cantidad FROM `facturas2`
  4.               ORDER BY id_requisicion DESC, [B]id_articulo DESC[/B])t1
  5. GROUP BY t1.id_articulo, t1.id_requisicion, t1.descripcion)t2 ON activos.descripcion = t2.descripcion
  6. SET activos.cantidad = activos.cantidad - t2.cantidad

Explicación. Iré comentando "las capas de la cebolla" de este SQL, pero de dentro a fuera:

1) (SELECT id_articulo, id_requisicion, unidad, descripcion, cantidad FROM `facturas2`
ORDER BY id_requisicion DESC, id_articulo DESC)t1
Seleccionas los campos ordenando por id_requisición descendente e id_articulo descendente, y cargas eso en una tabla virtual mediante el alias t1. El orden te colocará primero en esa tabla los que tienen los id_requisicion más altos, y, en caso de coincidencia en el id_requisicion, los que tienen un id_articulo más alto. El objetivo es recoger sólo los datos de id_requisicion más altos, y en caso de coincidencia, los de id_articulo más altos, algo que haremos en el punto 2.

2) (SELECT t1.id_articulo, t1.id_requisicion, t1.unidad, t1.descripcion, t1.cantidad FROM ... GROUP BY t1.id_articulo, t1.id_requisicion, t1.descripcion)t2
seleccionas de esa tabla virtual los campos, pero agrupando por id_articulo, id_requisicion, y descripcion, lo cual te deja, de los que coinciden en esos valores, el que está más arriba de la lista de la tabla virtual t1. Y a esa tabla virtual la llamas t2. No olvides que el GROUP BY, en caso de coincidencia de valor de campo agrupado, conserva el primer valor coincidente y los campos de ese registro.

3) UPDATE activos INNER JOIN... ON activos.descripcion = t2.descripcion ... SET activos.cantidad = activos.cantidad - t2.cantidad
cruzo las tabla activos con el resultado de la selección de 2, es decir con la tabla virtual t2, uniendo por descripcion (es el campo que coincide), y actualizo activos.cantidad poniendo en su lugar lo que había menos el valor de cantidad en la t2.

Última edición por jurena; 28/01/2010 a las 01:46