SQL: Как разделить столбец на количество?

#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

Ваш 1-й и 2-й запрос
Объедините их

Ответ №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

Живое решение:

http://sqlfiddle.com/#!9/f3de92/1

Ответ №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;
 

это должно быть возможно!