#mysql #sql #join #count
Вопрос:
Поэтому у меня есть такой запрос
SELECT distinct toner.device_id, printer.paper_count from toner
join printer on printer.device_id = toner.device_id;
Это напечатает что-то вроде
идентификатор устройства | paper_count |
---|---|
1 | 5000 |
2 | 10000 |
И у меня есть еще один запрос, который вернет количество раз, когда тонер менялся в соответствии с какой-то датой. Я использовал счетчик, чтобы подсчитать, сколько раз он был изменен.
select device_id, count(toner_color) as 'Change Count' from toner where
toner_color = 'Black' group by device_id;
Это напечатает что-то вроде
идентификатор устройства | Количество Изменений |
---|---|
1 | 2 |
2 | 2 |
То, что я пытаюсь получить, — это среднее количество бумаг, напечатанных 1 чернильной канистрой, например, 5000 листов бумаги / 2 банки с черными чернилами = 2500.
Поэтому я хочу получить что-то вроде этого
идентификатор устройства | paper_count | Количество Изменений | Средний |
---|---|---|---|
1 | 5000 | 2 | 2500 |
2 | 10000 | 2 | 5000 |
Ответ №1:
будет group by p.device_id, p.paper_count
, при фильтрации по where toner_color = 'Black'
:
select p.device_id, p.paper_count, count(toner_color) as 'Change Count'
, round(p.paper_count / count(toner_color)) as 'Average'
from toner t join printer p on p.device_id = t.device_id
where toner_color = 'Black'
group by p.device_id, p.paper_count;
MySQL v. 8.0 на скрипке БД
Ответ №2:
Ты почти на месте. Просто объедините эти два запроса:
SELECT *,
paper_count/change_count average
FROM
(
SELECT toner.device_id,
printer.paper_count,
COUNT(toner_color) AS change_count
FROM toner
INNER
JOIN printer ON printer.device_id = toner.device_id
WHERE toner_color = "black"
GROUP BY toner.device_id
)
AS dbx
Объяснение:
- ВНУТРЕННЕЕ СОЕДИНЕНИЕ тонера и принтера.
- Условие использования: toner_color = Черный
- СГРУППИРУЙТЕ ПО toner.device_id, чтобы узнать о количестве изменений на идентификатор устройства
- После этого среднее значение равно Paper_count/change_count
Ответ №3:
Создание таблиц:
CREATE TABLE printer(
device_id int(11),
paper_count int(11)
);
CREATE TABLE toner(
device_id int(11),
color varchar(32)
);
Вставка данных :
INSERT INTO printer(device_id,paper_count) VALUES (1,5000),(2,10000);
INSERT INTO toner(device_id,color) VALUES (1,"Black"),(1,"Black"),(2,"Black"),(2,"Black"),(3,"White");
Запрос:
SELECT printer.device_id, printer.paper_count, count(toner.device_id) as change_count, (printer.paper_count / count(toner.device_id)) as Average
FROM printer
JOIN toner on printer.device_id = toner.device_id
WHERE toner.color = "Black"
GROUP BY toner.device_id;
Выход:
идентификатор устройства | paper_count | Количество Изменений | Средний |
---|---|---|---|
1 | 5000 | 2 | 2500 |
2 | 10000 | 2 | 5000 |
Живое решение:
Ответ №4:
Давайте начнем с операции ОБЪЕДИНЕНИЯ :
SELECT t1.device_id, t1.paper_count, t2.ChangeCount , (t1.paperCount / t2.ChangeCount) as Average
FROM firsttable as t1
JOIN secondtable as t2 on t1.device_id = t1.device_id;
это должно быть возможно!