sql запрос с группировкой по столбцу - PullRequest
0 голосов
/ 11 марта 2020

У меня есть две таблицы транзакций и списков

Table T as fields of 

order_date timestamp 
order_id   BIGINT
listing_id INT
price INT

Table L with fields of 

listing_id INT 
price INT
category varchar

Если я хочу получить коэффициент продажи для каждой категории, если коэффициент продаж определяется как количество проданных объявлений, деленное на общее количество объявлений * 100, как я могу написать это? подойдет ли кейс или cte лучше?

таблица списков для всех доступных списков, а транзакции представляют все проданные

Спасибо

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

Попробуйте это

Схема (MySQL v5.7)


Запрос # 1

Create Table `gilbertdim_333952_L` (
    listing_id int NOT NULL AUTO_INCREMENT,
    price float,
    category varchar(10),
    PRIMARY KEY (listing_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Нет результатов для отображения.


Запрос # 2

INSERT INTO gilbertdim_333952_L (price, category) VALUES
(100, 'FOOD'),
(50, 'DRINKS');

Нет результатов для отображения.


Запрос # 3

Create Table `gilbertdim_333952_T` (
    order_id int NOT NULL AUTO_INCREMENT,
    order_date timestamp NULL DEFAULT CURRENT_TIMESTAMP,
    listing_id int,
    price float,
    PRIMARY KEY (order_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Нет результатов для отображения.


Запрос # 4

INSERT INTO gilbertdim_333952_T (listing_id, price) VALUES
(1, 100),(1, 100),(1, 100),
(2, 50),(2, 50);

Нет результатов для отображения.


Запрос # 5

SELECT l.*, (COUNT(1) / (SELECT COUNT(1) FROM gilbertdim_333952_T) * 100) as sales
FROM gilbertdim_333952_L l
LEFT JOIN gilbertdim_333952_T t ON l.listing_id = t.listing_id
GROUP BY l.listing_id;
| listing_id | price | category | sales |
| ---------- | ----- | -------- | ----- |
| 1          | 100   | FOOD     | 60    |
| 2          | 50    | DRINKS   | 40    |

Посмотреть на БД Fiddle

0 голосов
/ 11 марта 2020

Это то, что вы хотите?

select
    l.category,
    count(*) no_listing_transactions
    100.0 * count(*) / sum(count(*)) over() per100
from t
inner join l on l.listing_id = t.listing_id
group by l.category

Это дает вам количество транзакций по категориям и процент, который этот счет представляет по отношению к общему количеству транзакций.

Обратите внимание, что это использует оконные функции, которые требуют MySQL 8.0. В более ранних версиях одним из решений было бы использование коррелированного подзапроса (при условии, что нет «бесхозных» транзакций):

select
    l.category,
    count(*) no_listing_transactions
    100.0 * count(*) / (select count(*) from t) per100
from t
inner join l on l.listing_id = t.listing_id
group by l.category
...