#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-скрипки:
Я хотел бы получить следующий результат:
| 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
без агрегата.