查找满足某些条件的行的百分比

时间:2018-12-28 15:45:20

标签: sql

我有一个包含多列的表,我需要查找一列的不同值的百分比分布,但只考虑满足另一列中满足特定条件的行。

例如,如果我有:

name  |  hat_color | hometown
--------------------------------
John  |  Blue      | NYC
Mary  |  Blue      | NYC
Joe   |  Red       | NYC
Steve |  Yellow    | NYC
Bill  |  Blue      | Chicago
Sue   |  Yellow    | Chicago

我想要一个查询,告诉我纽约市每种帽子颜色的百分比:

hat_color |  Percentage
Blue      |    50
Red       |    25
Yellow    |    25

我尝试过:

select hat_color, count(hat_color) * 100.0 / (select count(*) from mytable) as Percentage
from mytable
WHERE mytable.hometown="NYC"
group by hat_color;

但这不起作用,只是给我总体百分比,就好像它是在计算整个表,而不仅仅是除数中的NYC一样。

我假设我的“哪里”放错了位置?应该去哪里?

2 个答案:

答案 0 :(得分:4)

您还需要在子选择中过滤NYC。

SELECT hat_color,
       count(hat_color) * 100.0 / (SELECT count(*)
                                          FROM mytable
                                          WHERE hometown = 'NYC') percentage
       FROM mytable
       WHERE hometown = 'NYC'
       GROUP BY hat_color;

也不要将字符串文字用双引号引起来。在SQL中,单引号用于此目的。

答案 1 :(得分:1)

最简单的方法是条件聚合:

select hat_color,
       avg(case when mytable.hometown = 'NYC' then 100.0 else 0 end) as  Percentage
from mytable
group by hat_color;

不需要子查询。

编辑:

我误解了这个问题。您可以根据需要使用窗口功能:

select hat_color,
       count(*) * 100.0 / sum(count(*)) over () as Percentage
from mytable
where mytable.hometown = 'NYC'
group by hat_color;