Sql 将一个表上的计数与另一个表上的计数分开,并将结果分组

Sql 将一个表上的计数与另一个表上的计数分开,并将结果分组,sql,postgresql,count,group-by,divide,Sql,Postgresql,Count,Group By,Divide,我试图计算表A中的行与表B中的行的比率。如果我只需要计算整个集合的比率,这将很容易,但我想按表B中存在的类别对它们进行分组。 表A和表B通过主键(id)链接 编辑: 我尝试了以下方法: select (select count(*) from class_a a left join football_players b on (b.id = a.id) group by age) / (select count(*) from football_players group

我试图计算表A中的行与表B中的行的比率。如果我只需要计算整个集合的比率,这将很容易,但我想按表B中存在的类别对它们进行分组。 表A和表B通过主键(id)链接

编辑:

我尝试了以下方法:

select
    (select count(*) from class_a a left join football_players b on (b.id = a.id) group by age)
    /
    (select count(*) from football_players group by age)
但是group by命令在这里不起作用。

在这里:

这是:


这将返回您想要的内容:

SELECT p.age, 100 * COUNT(c.id) / COUNT(p.id)
FROM football_players AS p
LEFT JOIN class AS c
  ON p.id = c.id
GROUP BY p.age

a类
的行数除以
足球运动员的行数

这将返回您想要的:

SELECT p.age, 100 * COUNT(c.id) / COUNT(p.id)
FROM football_players AS p
LEFT JOIN class AS c
  ON p.id = c.id
GROUP BY p.age

a类
的行数除以
足球运动员的行数

您需要外部联接,然后将外部联接表中的行数除以组中的总行数:

select fp.age, 
       (count(cl.id)::numeric / count(*)::numeric) * 100 as ration,
       count(cl.id) as class_count, 
       count(*) as age_count
from football_players fp
  left join class cl on fp.id = cl.id
group by fp.age  
必须使用cast
::numeric
才能获得小数,否则除法的结果将转换为整数


SQLFIDLE:

您需要一个外部联接,然后将外部联接表中的行数除以组中的行总数:

select fp.age, 
       (count(cl.id)::numeric / count(*)::numeric) * 100 as ration,
       count(cl.id) as class_count, 
       count(*) as age_count
from football_players fp
  left join class cl on fp.id = cl.id
group by fp.age  
必须使用cast
::numeric
才能获得小数,否则除法的结果将转换为整数


SQLFiddle:

似乎是我可以使用的东西,然而,年龄并不存在于a类,只存在于足球运动员中。。这行得通吗?@Jam:您的查询在两个表中都显示了
age
,但没有指定表名。你能给这两个表、示例数据和预期结果添加更多细节吗?是的,那是我的错误。。我不知道怎么做,因为(见我的表格和预期结果)似乎是我可以使用的东西,但是,a班不存在年龄,只有足球运动员。。这行得通吗?@Jam:您的查询在两个表中都显示了
age
,但没有指定表名。你能给这两个表、示例数据和预期结果添加更多细节吗?是的,那是我的错误。。我不知道如何做它其他(见我的表格和预期结果)嗯,我试图在这方面的工作,为我的问题。。。情况不尽相同。答案中一定要包含你的代码,指向外部站点的链接会自动关闭。特别是SQLFiddle没有那么可靠。嗯,我试着解决我的问题。。。情况不尽相同。答案中一定要包含你的代码,指向外部站点的链接会自动关闭。尤其是SQLFiddle并不是那么可靠。