2016-01-30 2 views
0

По какой-то неизвестной причине, запрос перемножить два поля SUM друг на друга:Почему Access умножает два SUM на eachother?

таблицы

products table 
+----+--------+ 
| id | p_name | 
+----+--------+ 
| 1 | name1 | 
| 2 | name2 | 
+----+--------+ 

warehouses table: 
+----+------------+ 
| id | w_name | 
+----+------------+ 
| 1 | warehouse1 | 
| 2 | warehouse2 | 
+----+------------+ 

intake table: 
+--------------+------------+--------+ 
| warehouse_id | product_id | amount | 
+--------------+------------+--------+ 
|   1 |   1 |  10 | 
|   1 |   1 |  10 | 
+--------------+------------+--------+ 

outtake table 
+--------------+------------+--------+ 
| warehouse_id | product_id | amount | 
+--------------+------------+--------+ 
|   1 |   1 |  5 | 
|   1 |   1 |  5 | 
+--------------+------------+--------+ 

запрос

SELECT warehouses.w_name, 
     products.p_name, 
     Sum(intake.units_amout) AS intakeSum, 
     Sum(outtake.amount) AS outtakeSum 
FROM (warehouses 
     INNER JOIN (products 
        INNER JOIN intake ON products.id = intake.product_id) ON warehouses.id = intake.warehouse_id) 
INNER JOIN outtake ON (warehouses.id = outtake.warehouse_id) 
AND (products.id = outtake.product_id) 
GROUP BY warehouses.w_name, 
     products.p_name; 

результат

+--------------+------------+-----------+------------+ 
| warehouse_id | product_id | intakeSum | outtakeSum | 
+--------------+------------+-----------+------------+ 
|   1 |   1 |  40 |   20 | 
+--------------+------------+-----------+------------+ 

ожидаемый результат

+--------------+------------+-----------+------------+ 
| warehouse_id | product_id | intakeSum | outtakeSum | 
+--------------+------------+-----------+------------+ 
|   1 |   1 |  20 |   10 | 
+--------------+------------+-----------+------------+ 

если я добавить третью запись на прием (с тем же продуктом и складских идентификаторами), то «outtakeSum» будет Multipy быть 3! и т. д.

ответ

1

Это связано с соединением, если всасывание с помощью таблицы выходов, что приведет к четырем суммам, приводящим к сумме 4 * 10 = 40 и 4 * 5 = 20.

Чтобы обойти это, вы можете сделать два подзапроса, один для таблиц приема и вывода, каждый из которых суммирует эти таблицы для каждой пары warehouse_id/product_id.

т.е .:

SELECT warehouse_id, product_id, SUM(amount) 
FROM intake 
GROUP BY warehouse_id, product_id; 

(и аналогичный запрос для таблицы вентиляционного)

Если вы используете эти запросы вместо впускного & Outtake для присоединения, он будет работать, как задумано.

Смежные вопросы