Совокупные значения в группе по

#mysql #sql

Вопрос:

Я использую mysql Ver 8.0.23-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu)) .

Я создал следующую базу данных:

 CREATE TABLE `transaction` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `company` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `filling_date` timestamp NULL DEFAULT NULL,
  `trx_type` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `amount_range` int DEFAULT NULL,
  `insider_price` decimal(30,4) DEFAULT NULL,
  `qty` int DEFAULT NULL,
  `transaction_value` decimal(30,4) DEFAULT NULL,
  PRIMARY KEY (`id`)
); 

INSERT INTO transaction (id, company, filling_date, trx_type, amount_range, insider_price, qty, transaction_value) VALUES(6, 'Apple', '2021-06-06 16:39:54.000', 'P - Purchase', 1000, 10, 100, 8000);
INSERT INTO transaction (id, company, filling_date, trx_type, amount_range, insider_price, qty, transaction_value) VALUES(7, 'Apple', '2021-06-05 15:29:34.000', 'S - Sale', 2000, 11, 200, 9000);
INSERT INTO transaction (id, company, filling_date, trx_type, amount_range, insider_price, qty, transaction_value) VALUES(8, 'Microsoft', '2021-06-05 11:22:15.000', 'P - Purchase', 2000, 10, 500, 1000);
INSERT INTO transaction (id, company, filling_date, trx_type, amount_range, insider_price, qty, transaction_value) VALUES(9, 'Apple', '2021-05-16 11:29:44.000', 'P - Purchase', 1000, 11, 1000, 10000);
INSERT INTO transaction (id, company, filling_date, trx_type, amount_range, insider_price, qty, transaction_value) VALUES(10, 'Microsoft', '2021-01-10 11:22:15.000', 'P - Purchase', 100, 30, 700, 3000);
INSERT INTO transaction (id, company, filling_date, trx_type, amount_range, insider_price, qty, transaction_value) VALUES(11, 'Microsoft', '2021-06-01 22:22:15.000', 'S - Sale', 6000, 60, 600, 4000);

 

Я хотел бы объединить все числовые значения всех компаний, у которых были Purchase транзакции за последние 31 дни.

Я могу отфильтровать все транзакции, которые произошли за последние 31 день:

 SELECT
    *
FROM
    transaction t
WHERE
    t.filling_date >= DATE(NOW()) - INTERVAL 31 DAY AND trx_type LIKE "%Purchase%"
ORDER BY
    t.filling_date DESC;
 

Найдите ниже мой пример db-скрипки:

Пример DB-Скрипки

Я хотел бы получить следующий результат:

 | id  | company   | last_filling_date   | trx_type     | amount_range | insider_price | qty  | transaction_value |
| --- | --------- | ------------------- | ------------ | ------------ | ------------- | ---- | ----------------- |
| 6   | Apple     | 2021-06-06 16:39:54 | P - Purchase | 2000         | 21.0000       | 1100 | 18000.0000        |
| 8   | Microsoft | 2021-06-05 11:22:15 | P - Purchase | 2000         | 10.0000       | 500  | 1000.0000         |

 

Есть какие-либо предложения, как объединить все числовые значения с помощью a group-by ?

Я ценю ваши ответы!

Ответ №1:

Вам просто нужно group by указать компанию и для всех негруппированных столбцов применить агрегатную операцию, в данном случае это sum для числовых значений и max для даты

 select Company, max(filling_date) Last_filling_date, trx_type,
  sum(amount_range) amount_range,
  sum(insider_price) insider_price,
  sum(qty) qty,
  sum(transaction_value) transaction_value
from transaction
where filling_date >= DATE(NOW()) - INTERVAL 31 DAY 
AND trx_type ='p - purchase'
group by company
 

Комментарии:

1. Если мы знаем, что такое trx_type, он нам на самом деле не нужен в ВЫБОРЕ

2. Это правда, столбец находится в результатах операции, по какой-то причине MySQL не нравится like без агрегата.