如何计算具有不同约束的相同表的百分比

时间:2015-01-09 19:22:17

标签: sql oracle

我有一个包含以下列的表,其中Type_ID是一种类型的车辆,例如汽车,自行车等。

几行数据看起来像这样:

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

我尝试做的是计算一种特定类型与当年总数的百分比(源表中有多年)。

所以,如果我选择Type_ID的特定值,我需要的结果类似于:

2000   0.4%
2001   0.61%
2002   0.73%

我尝试过加入,工会,子查询和各种各样的事情 - 这让我感到难过!任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:3)

您可以使用分析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;

使用非常有限的样本数据,所有三个查询都会得到相同的结果,但每个类型/年有多个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 

您再次只提供了一年的样本数据,但每年会有一行显示更多数据。

答案 1 :(得分:1)

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

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.