如何计算具有不同约束条件的相同 Table 的百分比

How To Work Out Percentage From Same Table With Different Constraints

我有一个包含以下列的 table,其中 Type_ID 是一种交通工具,例如汽车、自行车等。

几行数据看起来像这样:

ID  Traffic  Type_ID  Year
 1     5000        1  2000
 2       15        2  2000
 3     2100        3  2000

我想做的是计算出一种特定类型占当年总数的百分比(来源 table 中有多个年份)。

因此,如果我 select 的特定值 Type_ID,我需要的结果类似于:

2000   0.4%
2001   0.61%
2002   0.73%

我已经尝试过联接、联合、子查询和所有种类的方法 - 这让我感到难过!任何帮助表示赞赏。

您可以使用解析 sum() 获取年度总计作为伪列,并使用它来计算每一行的百分比:

select id, traffic, type_id, year,
  round(100 * traffic / sum(traffic) over (partition by year), 2) as pct
from t42
order by id;

        ID    TRAFFIC    TYPE_ID       YEAR        PCT
---------- ---------- ---------- ---------- ----------
         1       5000          1       2000      70.27 
         2         15          2       2000        .21 
         3       2100          3       2000      29.52 

我已将百分比四舍五入到小数点后两位,但这是可选的。

如果你想要每种类型的总流量的百分比,你也可以使用分析总和,这需要一个 distinct 这使得它有点混乱:

select distinct type_id, year,
  round(100 * sum(traffic) over (partition by type_id, year)
    / sum(traffic) over (partition by year), 2) as pct
from t42
order by type_id;

或者使用子查询查找每种类型和年份的总数:

select type_id, year,
  round(100 * traffic / sum(traffic) over (partition by year), 2) as pct
from (
  select type_id, year, sum(traffic) as traffic
  from t42
  group by type_id, year
)
order by type_id, year;

由于样本数据非常有限,所有三个查询都得到了相同的结果,但是每个 type/year 有多个 ID,您只会看到这两个查询中的任何一个的总数。

如果您只想要单一类型的结果,您可以将其中任何一个用作进一步的子查询,并使用 type_id 的过滤器,例如

select year, pct
from (
  select type_id, year,
    round(100 * traffic / sum(traffic) over (partition by year), 2) as pct
  from (
    select type_id, year, sum(traffic) as traffic
    from t42
    group by type_id, year
  )
)
where type_id = 1
order by year;

      YEAR        PCT
---------- ----------
      2000      70.27 

同样,您只提供了一年的示例数据,但这将每年显示一行,其中包含更多数据。

如果我没有正确理解你的问题,你需要如下内容:

SELECT year, type_pct FROM (
    SELECT year, type_id, traffic/SUM(traffic) OVER ( PARTITION BY year ) AS type_pct
      FROM mytable
 )
 WHERE type_id = 1 -- or 2 or 3 etc.