MySQL中的简单百分比计算

时间:2018-12-17 21:18:21

标签: mysql sql

我正在尝试在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 :(得分:2)

正如其他人所评论的那样,您无法在SQL中进行SUM(COUNT(*))

我假设您希望百分比是该日期范围内每个组的计数,而不是同一日期范围内所有组的总数。

我会在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

请记住在子查询中使用相同的日期范围条件。该查询无法猜测您的意思是仅仅因为外部查询中存在一个条件,所以子查询在同一日期范围内进行了计数。

答案 1 :(得分:1)

通常,您不应该在一个查询中使用多个聚合函数。

这类问题应使用视图解决。

创建一个同时包含分子和分母的视图,然后仅对该视图进行算术运算即可。

此外,我认为SUM(COUNT(*))并不是您真正想要的。请提供更多详细信息。

答案 2 :(得分:1)

您可以在子查询中使用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