Sql 基于外键的百分比

Sql 基于外键的百分比,sql,postgresql,percentage,Sql,Postgresql,Percentage,我有一个名为animals的表,它有以下列: id: INT state: VARCHAR id: INT animal_id: INT color: VARCHAR 和另一个名为houses的表,该表具有以下列: id: INT state: VARCHAR id: INT animal_id: INT color: VARCHAR 我正试图得到一个百分比的动物,哪个州是“活的”,它的ID在给定的范围内,至少有一个房子的颜色是“红色”。如果一只动物有一个以上的红房子,那没关系,应该只算

我有一个名为animals的表,它有以下列:

id: INT
state: VARCHAR
id: INT
animal_id: INT
color: VARCHAR
和另一个名为houses的表,该表具有以下列:

id: INT
state: VARCHAR
id: INT
animal_id: INT
color: VARCHAR
我正试图得到一个百分比的动物,哪个州是“活的”,它的ID在给定的范围内,至少有一个房子的颜色是“红色”。如果一只动物有一个以上的红房子,那没关系,应该只算一次

我知道如何获得这些条件下的动物数量:

SELECT COUNT(*)
FROM animals
WHERE state = 'living'
AND id IN (10,11,12)
SELECT COUNT(*)
FROM houses
WHERE color = 'red'
我知道如何获得具备这些条件的房子:

SELECT COUNT(*)
FROM animals
WHERE state = 'living'
AND id IN (10,11,12)
SELECT COUNT(*)
FROM houses
WHERE color = 'red'
我不确定如何结合这两个查询来获得动物的百分比

样本数据:

animals (id, state)

1, 'living'
2, 'dead'
3, 'living'
4, 'living'
5, 'dead'
6, 'living'


houses (id, animal_id, color)

1, 1, 'red'
2, 2, 'red'
3, 1, 'blue'
4, 6, 'red'
5, 4, 'red'
6, 1, 'red'  
我们想把动物的范围缩小到ID为1、2、3和5的动物

因此,由于ID为2和5的动物已经死亡,因此不应将它们作为分母的一部分计算。现在,这就给我们留下了动物1和3,但只有id为1的动物至少有一个红屋通知,它有两个,但我们不在乎,这意味着百分比是:

1只动物至少有一个阅读室/2只动物存活=50%

您可以使用左连接来组合表。然后,可以使用AVG获得您想要的比率:

SELECT AVG( (h.color = 'red')::int ) as ratio_red
FROM animals a LEFT JOIN
     houses h
     ON a.id = h.animal_id
WHERE a.state = 'living'
      a.id IN (10, 11, 12);
对于修改后的计算,可以使用:

SELECT COUNT(DISTINCT CASE WHEN h.color = 'red' THEN h.animal_id END) / COUNT(DISTINCT a.id) as ratio_red
FROM animals a LEFT JOIN
     houses h
     ON a.id = h.animal_id
WHERE a.state = 'living'
      a.id IN (10, 11, 12);

选择动物标识、颜色、居住地点t1 内接缝选择Id,按Id t2将*计算为动物组的活体
在t1.animalid=t2.id上,color='red'

Gordon,如果一只动物有一个以上的红房子,这不算两次吗?我只想让每只动物/红房子组合计算一次。@HommerSmith。有可能吗?是的,我更新了我的样本数据,表示动物1有两个红房子,但我们不在乎。我们只想知道至少有一个红房子的活动物的百分比。很抱歉,我没有在示例数据中添加该场景。