Простой процентный расчет в MySQL - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь запустить простой расчет процентов в MySQL.Это кажется довольно простым, но, очевидно, что-то здесь не так.

Select state, job_type, count(*) cnt, (count(*)/(SELECT SUM(count(*)) FROM flow.job)) * 100 AS pct
From flow.job J
Where start_date >= '2018-12-14'
Group by state, job_type

Код ошибки: 1111. Неправильное использование групповой функции

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

select DR.state, count(*) cnt, (count(*)/(SELECT SUM(count(*)) FROM flow.run DR, flow.job J where DR.id = J.id)) * 100 AS pct
from flow.run DR, flow.job J
where DR.id = J.id
and DR.start_date > '2018-12-08'
group by DR.state

Я получаю ту же ошибку ...

Код ошибки: 1111. Неправильное использование групповой функции

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Как прокомментировали другие, вы не можете сделать SUM(COUNT(*)) в SQL.

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

Я бы вычислила сумму как подзапрос вПредложение FROM, поэтому он выполняет подзапрос один раз и повторно использует его результат.

SELECT DR.state, COUNT(*) AS count, COUNT(*) / total.count AS pct
FROM flow.run AS DR
JOIN flow.job AS J ON DR.id = J.id
CROSS JOIN (
  SELECT COUNT(*) AS count 
  FROM flow.run AS DR
  JOIN flow.job AS J ON DR.id = J.id
  WHERE DR.start_date > '2018-12-08'
) AS total
WHERE DR.start_date > '2018-12-08'
GROUP BY DR.state

Не забудьте использовать то же условие диапазона дат в подзапросе.Запрос никак не может угадать, что вы имели в виду строки, подсчитанные в подзапросе из одного и того же диапазона дат, только потому, что во внешнем запросе существует условие.

0 голосов
/ 18 декабря 2018

Вы бы использовали JOIN с подзапросом, который вычисляет общее количество потоков для данного задания.

SELECT J.state, J.job_type, COUNT(*) cnt, COUNT(*)/SUM(total.cnt) * 100 AS pct
FROM
    flow.job J
    JOIN (select job_id, COUNT(*) AS cnt FROM flow.job) total ON total.id = J.id
WHERE J.start_date >= '2018-12-14'
GROUP BY J.state, J.job_type
0 голосов
/ 18 декабря 2018

Как правило, вы не должны использовать более одной агрегатной функции в запросе.

Такие проблемы должны решаться с помощью представлений.

Создайте представление, которое содержит оба числителяи знаменатель, а затем просто делайте арифметику исключительно для представления.

Кроме того, я не думаю, что SUM(COUNT(*)) - это то, что вы действительно ищете.Пожалуйста, предоставьте более подробную информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...