我有一个包含以下列的表,其中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%
我尝试过加入,工会,子查询和各种各样的事情 - 这让我感到难过!任何帮助表示赞赏。
答案 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.