2012-09-10 29 views
5

Trong một cơ sở dữ liệu quản lý chứng khoán đơn giản, số lượng cổ phiếu mới được thêm vào và vận chuyển cho đến khi số lượng đạt đến 0. Mỗi chuyển động cổ phiếu được gán một tham chiếu, chỉ có tham chiếu mới nhất được sử dụng.Tương quan GROUP BY và LEFT JOIN trên nhiều tiêu chí để hiển thị hồ sơ mới nhất?

Trong ví dụ được cung cấp, các tài liệu tham khảo mới nhất không bao giờ được hiển thị, mã chứng khoán của 1,4 nên có tham chiếu charlie, foxtrot tương ứng, nhưng thay vào đó hiển thị alpha, delta.

Làm cách nào để có thể liên kết GROUP BY và LEFT trên nhiều tiêu chí để hiển thị bản ghi mới nhất?

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 

Trả lời

1

Bạn có thể sử dụng một subquery để kéo ID mới nhất cho từng nhóm cổ phiếu:

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

đánh bại tôi vào nó. http://sqlfiddle.com/#!2/4edd4/1 – Kermit