我正在尝试在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。组功能的无效使用
答案 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