SQL Select 占总数的百分比(基于位置)

SQL Select percentage from total based on location

我想解决以下问题:

为每种运动类型给出区域 10 中的事件占该运动类型的事件总数的百分比。

我有两个表:

events:列出所有体育赛事。 “sport_type”列定义了赛事的运动类型;它有一个点几何。

zones:列出所有名称为 ex 的区域。 'region 10'。它们具有多边形几何形状。

列出我拥有的每种运动类型的项目数量:

select e.sport_type as Sport_Type, count(e.sport_type) as Number_of_Events
from events e
group by e.sport_type

要列出区域 10 中每种运动类型的事件数,我有:

select e.sport_type as Sport_Type, count(e.sport_type) as Number_of_Events
from events e
inner join zones z
on st_contains(z.geom, e.geom)
where z.name = 'region 10'
group by e.sport_type

为了解决这个问题,我尝试了类似的方法但没有成功:

select e1.sport_type as Sport_Type,  (x.Numev / count(e1.sport_type)) as Number_of_Events
from events e1, (select e2.sport_type as evtype, count(e2.sport_type) as Numev
from programs e2
inner join zones z
on st_contains(z.geom, e2.geom)
where z.name = 'region 10'
group by e2.sport_type) x
group by e1.sport_type, x.Numev

使用两个子选择创建一个非常不言自明的查询:

SELECT sport_type, 100. * r10.total / sports.total AS r10_percent
FROM (
    SELECT sport_type, count(sport_type) AS total
    FROM events
    GROUP BY sport_type) sports
JOIN (
    SELECT sport_type, count(sport_type) AS total
    FROM events
    JOIN zones ON ST_Contains(zones.geom, events.geom)
    WHERE zones.name = 'region 10'
    GROUP BY events.sport_type) r10 USING (sport_type);

还没有测试,试试吧,因为你有很多事件,你可以很容易地计算出百分比(例如:外面还有 1 个 select)

select 
    e.sport_type as Sport_Type, 
    count(*) as totalEvents,
    sum(CASE 
            WHEN z.name = 'region 10' THEN 1
            ELSE 0
        END
    ) as totalEventsInRegion10
from events e
    left join zones z on st_contains(z.geom, e.geom)
group by e.sport_type