Vấn đề của tôi. Tôi có 3 bàn. Một với các mặt hàng, một với giao hàng sắp tới và một với giao hàng đi
Bảng được gọi là các mục
id | item_name
----------------
1 | Bike
2 | Helmet
3 | Pedal
4 | Light
Bảng được gọi là đi vào
id | item_id | quantity
-----------------------
1 | 2 | 5
2 | 3 | 2
3 | 4 | 1
4 | 1 | 5
5 | 2 | 4
6 | 1 | 6
7 | 3 | 5
Bảng gọi đi
id | item_id | quantity
-----------------------
1 | 3 | 2
2 | 1 | 1
3 | 2 | 3
4 | 3 | 4
5 | 1 | 2
6 | 2 | 1
7 | 4 | 1
Những gì tôi muốn làm là lấy tổng số lượng trong kho bằng cách trừ đi các lần giao hàng đi từ lần giao hàng sắp tới và đặt hàng theo mặt hàng có số lượng ít nhất
Có lẽ có một cách tốt hơn để làm điều này?
Đây là truy vấn mà tôi nhận được, nhưng số tiền SUM không chính xác. Ai đó có thể giúp tôi và giải thích tại sao số tiền SUM không chính xác không và tôi nên giải quyết vấn đề này theo cách tốt nhất như thế nào?
SELECT items.id AS ID,
items.item_name,
Sum[ingoing.quantity] - Sum[outgoing.quantity] AS InStock
FROM items
LEFT JOIN ingoing
ON ingoing.item_id = items.id
LEFT JOIN outgoing
ON outgoing.item_id = items.id
GROUP BY ID
ORDER BY InStock ASC
Đây là kết quả tôi muốn từ này
ID | item_name | InStock
---------------------------
4 | Light | 0
3 | Pedal | 1
2 | Helmet | 5
1 | Bike | 8
Những gì tôi nhận được
ID | item_name | InStock
---------------------------
4 | Light | 0
3 | Pedal | 2
2 | Helmet | 10
1 | Bike | 16
- stackoverflow. comghi bàn. 3
câu trả lời được chấp nhận
Có thể dễ dàng quên đi tác động nhân lên của việc tham gia. Khi bạn gặp sự cố như thế này, hãy kiểm tra kết quả của phép nối trước khi lọc/nhóm
SELECT items.id,
items.item_name,
ingoing.id AS ingoing,
outgoing.id AS outgoing
FROM items
LEFT JOIN ingoing
ON ingoing.item_id = items.id
LEFT JOIN outgoing
ON outgoing.item_id = items.id
Xem nó trên
Như bạn có thể thấy, tập kết quả chứa nhiều bản ghi có cùng giá trị
id | item_id | quantity
-----------------------
1 | 2 | 5
2 | 3 | 2
3 | 4 | 1
4 | 1 | 5
5 | 2 | 4
6 | 1 | 6
7 | 3 | 5
2 và nhiều bản ghi có cùng giá trị id | item_id | quantity
-----------------------
1 | 2 | 5
2 | 3 | 2
3 | 4 | 1
4 | 1 | 5
5 | 2 | 4
6 | 1 | 6
7 | 3 | 5
0. Điều này là do mỗi bản ghi đầu vào cho một mặt hàng cụ thể đã kết hợp với mọi bản ghi đầu ra cho cùng một mặt hàng đó. do đó, có 4 bàn đạp trong tập kết quả [2 đến x 2 đi], v.v.Tổng hợp từng bảng theo mục trước khi tham gia [và do đó đảm bảo rằng chỉ có 1 bản ghi cho mỗi mục ở mỗi bên của liên kết] sẽ đạt được những gì bạn đang theo đuổi
________số 8Xem nó trên
Lưu ý rằng vấn đề của bạn sẽ được đơn giản hóa rất nhiều bằng cách chỉ có một bảng cơ bản duy nhất về chuyển động của hàng tồn kho, với các đại lượng dương biểu thị các chuyển động theo một hướng và các đại lượng âm biểu thị các chuyển động theo hướng ngược lại. sau đó một tổng kết theo nhóm đơn giản của toàn bộ bảng sẽ mang lại kết quả mong muốn của bạn
Toán tử MINUS trong SQL được sử dụng để trả về tất cả các hàng trong câu lệnh SELECT đầu tiên không được trả về bởi câu lệnh SELECT thứ hai. Mỗi câu lệnh SELECT sẽ xác định một tập dữ liệu. Toán tử TRỪ sẽ truy xuất tất cả các bản ghi từ tập dữ liệu đầu tiên và sau đó xóa khỏi kết quả tất cả các bản ghi từ tập dữ liệu thứ hai
truy vấn trừ
Giải trình. Truy vấn MINUS sẽ trả về các bản ghi trong khu vực được tô bóng màu xanh lam. Đây là những bản ghi tồn tại trong Dataset1 chứ không phải trong Dataset2
Mỗi câu lệnh CHỌN trong truy vấn TRỪ phải có cùng số trường trong tập kết quả có kiểu dữ liệu tương tự
TIỀN BOA. Toán tử TRỪ không được hỗ trợ trong tất cả các cơ sở dữ liệu SQL. Nó có thể được sử dụng trong cơ sở dữ liệu như Oracle
Đối với các cơ sở dữ liệu như SQL Server, PostgreSQL và SQLite, hãy sử dụng toán tử EXCEPT để thực hiện loại truy vấn này
cú pháp
Cú pháp của toán tử TRỪ trong SQL là
SELECT expression1, expression2, .. expression_n FROM tables [WHERE conditions] MINUS SELECT expression1, expression2, .. expression_n FROM tables [WHERE conditions];
Tham số hoặc Đối số
biểu thức1, biểu thức2, biểu thức_nCác cột hoặc phép tính mà bạn muốn truy xuất. tableCác bảng mà bạn muốn truy xuất các bản ghi từ. Phải có ít nhất một bảng được liệt kê trong mệnh đề TỪ. điều kiện WHERETùy chọn. Đây là những điều kiện phải được đáp ứng để hồ sơ được chọnGhi chú
- Phải có cùng số biểu thức trong cả hai câu lệnh SELECT
- Các biểu thức tương ứng phải có cùng kiểu dữ liệu trong câu lệnh SELECT. Ví dụ. biểu thức1 phải có cùng kiểu dữ liệu trong cả câu lệnh SELECT thứ nhất và thứ hai
Ví dụ - Với biểu thức đơn
Sau đây là ví dụ toán tử SQL MINUS có một trường có cùng kiểu dữ liệu
id | item_id | quantity
-----------------------
1 | 2 | 5
2 | 3 | 2
3 | 4 | 1
4 | 1 | 5
5 | 2 | 4
6 | 1 | 6
7 | 3 | 5
0Ví dụ SQL MINUS này trả về tất cả các giá trị supply_id trong bảng nhà cung cấp và không có trong bảng đơn đặt hàng. Điều này có nghĩa là nếu giá trị nhà cung cấp_id tồn tại trong bảng nhà cung cấp và cũng tồn tại trong bảng đơn đặt hàng, thì giá trị nhà cung cấp_id sẽ không xuất hiện trong tập hợp kết quả này
Ví dụ - Sử dụng mệnh đề ORDER BY
Sau đây là một ví dụ toán tử TRỪ sử dụng mệnh đề ORDER BY
id | item_id | quantity
-----------------------
1 | 2 | 5
2 | 3 | 2
3 | 4 | 1
4 | 1 | 5
5 | 2 | 4
6 | 1 | 6
7 | 3 | 5
1Trong ví dụ toán tử SQL MINUS này, vì tên cột khác nhau giữa hai câu lệnh SELECT, nên sẽ thuận lợi hơn khi tham chiếu các cột trong mệnh đề ORDER BY theo vị trí của chúng trong tập kết quả. Trong ví dụ này, chúng tôi đã sắp xếp kết quả theo tên_nhà cung cấp / tên_công ty theo thứ tự tăng dần, được biểu thị bằng ____13