如何计算具有不同约束条件的相同 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.
我有一个包含以下列的 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.