基于 foreign_key 的百分比
Percentage based on foreign_key
我有一个名为 animals
的 table,它有以下列:
id: INT
state: VARCHAR
还有另一个 table 称为具有以下列的房屋:
id: INT
animal_id: INT
color: VARCHAR
我正在尝试获取至少有一个房子(颜色为 'red')的给定集合内的动物(其状态为 'living')及其 ID 的百分比。如果一个动物有不止一个红房子,没关系,应该只算一次。
我知道如何获得符合这些条件的动物数量:
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%
您可以使用 LEFT JOIN
来合并表格。然后可以用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);
Select animal_id,color ,住在 t1 号房子
内部 join(select Id,count(*) as living from animal group by id) t2
在 t1.animalid=t2.id where color='red'
我有一个名为 animals
的 table,它有以下列:
id: INT
state: VARCHAR
还有另一个 table 称为具有以下列的房屋:
id: INT
animal_id: INT
color: VARCHAR
我正在尝试获取至少有一个房子(颜色为 'red')的给定集合内的动物(其状态为 'living')及其 ID 的百分比。如果一个动物有不止一个红房子,没关系,应该只算一次。
我知道如何获得符合这些条件的动物数量:
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%
您可以使用 LEFT JOIN
来合并表格。然后可以用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);
Select animal_id,color ,住在 t1 号房子 内部 join(select Id,count(*) as living from animal group by id) t2 在 t1.animalid=t2.id where color='red'