MySQL中的简单百分比计算

MySQL中的简单百分比计算,mysql,sql,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。组函数的使用无效 如果查询稍微复杂一些,

我试图在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。组函数的使用无效


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

这些问题应该使用视图来解决

创建一个同时包含分子和分母的视图,然后只需对该视图执行算术运算


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

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

这些问题应该使用视图来解决

创建一个同时包含分子和分母的视图,然后只需对该视图执行算术运算


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

正如其他人所评论的,您不能在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

记住在子查询中使用相同的日期范围条件。查询无法仅仅因为外部查询上存在条件而猜测您指的是子查询中从相同日期范围计数的行。

正如其他人所评论的,您不能在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

记住在子查询中使用相同的日期范围条件。查询无法仅仅因为外部查询上存在条件而猜测您指的是子查询中从相同日期范围计数的行。

您将使用一个
连接
子查询来计算给定作业的流总数

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

您可以将
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

请提供一些数据示例和预期结果除了聚合发生聚合的子查询的结果外,您不能嵌套组函数。语法不允许您从表达式
sum(count(*)
中指定sum和count的不同分组
'SELECT sum(count(*)from flow.job'
?今天的提示:切换到现代的显式
JOIN
语法。更易于写入(无错误)、更易于读取(和维护),并且在需要时更易于转换为外部联接。删除总和并简单地从流中使用
选择计数(*)。作业
请提供一些数据示例和预期结果您不能在聚合发生聚合的子查询的结果之外嵌套组函数。语法不允许您从表达式
sum(count(*)
中指定sum和count的不同分组
'SELECT sum(count(*)from flow.job'
?今天的提示:切换到现代的显式
JOIN
语法。更易于写入(无错误),更易于读取(和维护),并且在需要时更易于转换为外部联接。删除总和并简单地从流中使用
选择计数(*)。作业
感谢比尔!!现在这一切都很完美,而且现在也更有意义了!!谢谢你,比尔!!现在这一切都很完美,而且现在也更有意义了!!