Объединение двух таблиц (JOIN), группирование (GROUP BY) по двум параметрам из одной из них и арифметические операции с ними

Всем привет.
У меня есть две таблицы (MySQL-8.0-Win10):

Создаю первую таблицу

CREATE TABLE `products` ( `product_id` INT NOT NULL AUTO_INCREMENT ,                                               
`product_name` VARCHAR(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL ,                                  
`product_unit` VARCHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL ,                                         
 PRIMARY KEY (`product_id`)) ENGINE = InnoDB;

Создаю вторую таблицу

CREATE TABLE `products_operations` ( `product_id` INT NOT NULL , 
`operation_status` INT NOT NULL ,                        
`operation_size` DECIMAL(11,4) NOT NULL ) ENGINE = InnoDB;

Добавляю данные в первую таблицу

INSERT INTO `products` (`product_id`, `product_name`, `product_unit`) 
VALUES ('1', 'Песок', 'м3'), ('2', 'Песок', 'т'),                   
('3', 'Цемент', 'т'), ('4', 'Щебень', 'м3');

Добавляю данные во вторую таблицу

INSERT INTO `products_operations` (`product_id`, `operation_status`, `operation_size`)                                                      
VALUES ('1', '1', '3000'), ('1', '2', '2500'), ('2', '1', '1000'),  
('2', '2', '750'), ('2', '2', '50'), ('3', '1', '100'), ('4', '1', '500'),                                                                 
('1', '1', '100');

products (Таблица 1) - список товаров

product_id (id товара) product_name (имя товара) product_unit (ед. изм. товара)
1 Песок м3
2 Песок т
3 Цемент т
4 Щебень м3

products_operations (Таблица 2) - операции с товарами

product_id (id товара) operation_status (1 - приход, 2 - расход) operation_size (объем операции)
1 1 3 000,00
1 2 2 500,00
2 1 1 000,00
2 2 750,00
2 2 50,00
3 1 100,00
4 1 500,00
1 1 100,00

Моя задача вывести в браузер следующие данные:

product_name (имя товара) product_unit (ед. изм. товара) приход (сумма всех приходов
(operation_status = 1) по параметру
product_name (имя товара) +
product_unit (ед. изм. товара)
расход (сумма всех расходов
(operation_status = 2) по параметру
product_name (имя товара) +
product_unit (ед. изм. товара)
остаток (разность всех приходов и
расходов по параметру
product_name (имя товара) +
product_unit (ед. изм. товара)
Песок м3 3 100,00 2 500,00 600,00
Песок т 1 000,00 800,00 200,00
Цемент т 100,00 0,00 100,00
Щебень м3 500,00 0,00 500,00

Как вытащить суммы приходов и расходов по-отдельности для каждого product_name (имя продукта), я понимаю. Трудность для меня в том, чтобы вытащить данные для пары product_name (имя товара) + product_unit (ед. изм. товара). Если нужно, могу свои кривые варианты скинуть. Но ни один из них не работает.
Спасибо.

upd. Изначально задача стояла вывести только приход. И так как объем прихода был в таблице products, то запрос был такой:

SELECT product_name, product_unit,                                               
SUM(product_size) AS sum_product_size                                
FROM products                                                       
GROUP BY product_name, product_unit                                 
ORDER BY sum_product_size DESC;

Далее добавилась еще одна таблица (product_operations) и запросы для расхода и остатка у меня выглядели так:

Получаю сумму прихода:

$income_sum = mysqli_query($connect, "SELECT SUM(operation_size) as sum 
FROM `products_operations`                                          
WHERE `product_id` = '$prdct_id' AND `operation_status` = '1'");
                                                                
$incm_sum = mysqli_fetch_assoc($income_sum);
$incm_sm = $incm_sum['sum'];

В этом и затык, что $prdct_id это айди продукта без привязки к паре (product_id + product_unit).

Далее получаю сумму расхода:

$spending_sum = mysqli_query($connect, "SELECT SUM(operation_size) as sum                                                                      
FROM `products_operations`                                          
WHERE `product_id` = '$prdct_id' AND `operation_status` = '2'");
                                                              
$spndng_sum = mysqli_fetch_assoc($spending_sum);                                                           
$spndng_sm = $spndng_sum['sum'];

И чтобы в итоге получить остаток, делаю следующее:

$balance_sum = $incm_sm - $spndng_sm;

upd2. На данный момент пришел к такому виду запроса:

SELECT products.product_name, products.product_unit, products_operations.operation_status, 
SUM(products_operations.operation_size) as sum_product_size          
FROM products                                                        
JOIN products_operations                                               
ON products.product_id = products_operations.product_id             
GROUP BY product_name, product_unit                                 
ORDER BY sum_product_size DESC

Однако, я получаю ошибку

Fatal error: Uncaught mysqli_sql_exception: Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'products_operations.operation_status' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by in...

Это, вроде как, из за того, что в SELECT есть products_operations.operation_status, а в GROUP BY его нет. Но как решить эту проблему, я пока не понял

upd3. Решение, вроде как, найдено. Помог разобраться @Mike. Команда выглядит следующим образом:

SELECT products.product_name, products.product_unit, 
SUM(products_operations.operation_size * 
(products_operations.operation_status = 1)) as sum_product_size_income, 
SUM(products_operations.operation_size * 
(products_operations.operation_status = 2)) as sum_product_size_spending    
FROM products                                                        
JOIN products_operations                                               
ON products.product_id = products_operations.product_id                          
GROUP BY product_name, product_unit                                 
ORDER BY sum_product_size_1 DESC

Спасибо большое!


Ответы (0 шт):