2016-10-05 28 views
6

cơ sở dữ liệu của tôi trông như sauMySQL Thêm & Nhiều Cột On Chọn

Bảng Name: Đặt hàng Chi tiết

id  oid  pid pquantity pprice 
-------------------------------------- 
    1  1  5  2  10 
    2  1  6  3  5 
    3  1  7  1  20 
    5  2  8  1  5 
    6  2  9  1  5 
    7  3  5  5  10 

Bảng Tên: Đơn đặt hàng

id  odiscount oshipping 
---------------------------- 
    1  5  5   
    2  0  5   
    3  0  5 

tôi muốn có được giá trị hóa đơn cho mỗi đơn hàng. (pquantity*pprice)-odiscount+oshipping. Phần khó khăn là mỗi đơn đặt hàng có thể có nhiều mục trong chi tiết đơn đặt hàng. Vì vậy, tôi không thể tìm ra cách để chăm sóc điều đó. Kết quả cuối cùng phải là

oid total 
1  55 
2  15 
3  55 

Tôi đã thử bằng cách sử dụng SQL sau nhưng tôi không thể tìm ra cách lấy nhiều hàng trong chi tiết đơn đặt hàng.

SELECT SUM((orderdetails.pprice*orderdetails.pquantity) - orders.odiscount + orders.oshipping) FROM orders LEFT JOIN orderdetails ON orderdetails.oid = orders.id GROUP BY orders.id 

Trả lời

3

Tôi tin rằng bạn có thể làm điều này mà không cần sử dụng một subquery:

SELECT SUM(od.pquantity*od.pprice) + AVG(o.oshipping - o.odiscount) 
FROM Orders o 
INNER JOIN OrderDetails od 
    ON o.id = od.oid 
GROUP BY o.id 

Demo tại đây:

SQLFiddle

+1

Có gì sai khi sử dụng truy vấn phụ? – sagi

+0

Tôi đồng ý rằng đây có lẽ là cách để đi, nhưng tôi rất bối rối bởi thái độ đối với ý kiến. – Strawberry

+3

@Strawberry Sagi thường xuyên đổ một tấn ý kiến ​​vào câu trả lời của tôi, tạo ra một cuộc trò chuyện không có gì, với hy vọng rằng câu trả lời của anh ấy sẽ xuất hiện nguyên sơ hơn, và do đó chính xác hơn, so với mọi người khác. Bình luận: chiến thuật này dường như làm việc thực sự tốt (mặc dù tôi không sử dụng nó). –

3

Bạn có thể nhóm các truy vấn order_details đầu tiên, và chỉ sau đó tham gia nó trên bàn orders:

SELECT sum_details - odiscount + oshipping 
FROM orders o 
JOIN (SELECT oid, SUM(pquantity * pprice) AS sum_details 
     FROM  order_details 
     GROUP BY oid) d ON o.id = d.oid