2012-09-10 39 views
5

En una base de datos simple de administración de existencias, se agrega y envía cantidad de existencias nuevas hasta que la cantidad llegue a cero. A cada movimiento de stock se le asigna una referencia, solo se utiliza la última referencia.¿Se correlaciona GROUP BY y LEFT JOIN en múltiples criterios para mostrar el último registro?

En el ejemplo proporcionado, nunca se muestran las últimas referencias, la ID de la acción 1,4 debe tener referencias charlie, foxtrot respectivamente, pero en su lugar muestra alfa, delta.

¿Cómo se puede correlacionar un GROUP BY y LEFT JOIN en múltiples criterios para mostrar el último registro?

http://sqlfiddle.com/#!2/6bf37/107

CREATE TABLE stock (
    id tinyint PRIMARY KEY, 
    quantity int, 
    parent_id tinyint 
); 

CREATE TABLE stock_reference (
    id tinyint PRIMARY KEY, 
    stock_id tinyint, 
    stock_reference_type_id tinyint, 
    reference varchar(50) 
); 

CREATE TABLE stock_reference_type (
    id tinyint PRIMARY KEY, 
    name varchar(50) 
); 

INSERT INTO stock VALUES 
(1, 10, 1), 
(2, -5, 1), 
(3, -5, 1), 
(4, 20, 4), 
(5, -10, 4), 
(6, -5, 4); 

INSERT INTO stock_reference VALUES 
(1, 1, 1, 'Alpha'), 
(2, 2, 1, 'Beta'), 
(3, 3, 1, 'Charlie'), 
(4, 4, 1, 'Delta'), 
(5, 5, 1, 'Echo'), 
(6, 6, 1, 'Foxtrot'); 

INSERT INTO stock_reference_type VALUES 
(1, 'Customer Reference'); 

SELECT stock.id, SUM(stock.quantity) as quantity, customer.reference 
FROM stock 
LEFT JOIN stock_reference AS customer ON stock.id = customer.stock_id AND stock_reference_type_id = 1 
GROUP BY stock.parent_id 

Respuesta

1

Se puede utilizar una subconsulta para tirar de la última ID para cada grupo stock:

SELECT g.parent_id, g.quantity, customer.reference 
FROM (
    SELECT parent_id, SUM(stock.quantity) as quantity, MAX(id) as LatestID 
    FROM stock 
    GROUP BY parent_id 
) g LEFT JOIN stock_reference AS custome 
    ON g.LatestID = customer.stock_id AND stock_reference_type_id = 1 
+2

se me adelantó. http://sqlfiddle.com/#!2/4edd4/1 – Kermit