如何在SQL中分配百分比?

时间:2018-11-30 08:15:05

标签: sql

| proj_id | list_date  | state  | Status     | 
|   1     |   03/05/10 |   CA   | Finished   |
|   2     |   04/05/10 |   WA   | Unfinished |
|   3     |   03/05/10 |   WA   | Finished   |
|   4     |   04/05/10 |   CA   | Finished   |
|   5     |   03/05/10 |   WA   | Unfinished |
|   6     |   04/05/10 |   CA   | Finished   |

我可以写什么查询来确定每个上市月份和状态中已完成项目的百分比?

我目前已编写以下代码,以按月和州对项目数量进行分组

select 
    month(list_date), state_name, count (*) as Projects 
from 
    projects 
group by 
    month(list_date), state_name;

然后我该如何纳入每个上市月份中已完成或未完成的项目的百分比?

所需的输出:

     | list_date | state  | Proj_Count | % Finished
     |   March   |   CA   |     2      |    10%    
     |   April   |   WA   |     3      |    20%
     |   July    |   WA   |     6      |    50%
     |   August  |   CA   |     5      |    40%

2 个答案:

答案 0 :(得分:1)

将其放在选择中:

100 * count(case when state = 'Finished' then 1 else null end) / cast(count(*) as float)

我不清楚您是要按州,按月还是按月完成百分比。如果是后者,则涉及更多

Count对集合中的非null进行计数。如果状态完成,则返回1。如果状态为其他任何值,则返回null,它不影响计数

请注意,上面的计算将使用INT进行,因此我们将其中一个操作数强制转换为浮点数(或数据库所支持的任何小数点类型),以便使用小数位来进行计算。没有这个,一些db只会产生0,因为small_int / large_int始终为0

答案 1 :(得分:1)

您可以使用avg()聚合功能轻松完成此操作:

select month(list_date), state_name, count(*) as Projects,
       avg(case when status = 'Finished' then 100.0 else 0 end) as percent_finished 
from projects 
group by month(list_date), state_name;

要查看其工作原理,只需在一个示例上进行计算即可:

Finished        100
Unfinished        0
Finished        100
Unfinished        0
Unfinished        0

平均值为(100 + 100) / 5 =40。这就是您要寻找的百分比。