如何使用与计数不同语句相关的百分比创建附加列

Posted

技术标签:

【中文标题】如何使用与计数不同语句相关的百分比创建附加列【英文标题】:How to create an additional column with the percentages related to a count distinct statement 【发布时间】:2019-07-19 20:27:55 【问题描述】:

我正在尝试在表格中查询每个不同的医学专业(例如肿瘤科医生、儿科医生等),然后计算一个索赔 (claim_id) 与其相关联的次数,我已经使用了这个:

select distinct specialization, count(distinct claim_id) AS Claim_Totals
from table1
group by specialization
order by Claim_Totals DESC

但是,我还想增加一列,列出表格中每个专业构成的百分比(基于与之相关的claim_id 的数量)。因此,例如,如果总共有 100 条索赔,并且“cardiologist”有 25 条 claim_id 相关记录,“oncologist”有 15 条,“普通外科医生”有 10 条,依此类推,我希望输出如下所示:

specialization | Claims_Totals | PERCENTAGE
___________________________________________
cardiologist       25               25%
oncologist         15               15%
general surgeon    10               10%

【问题讨论】:

distinct before specialization 在 select 列表中是多余的,因为已经包含在 group by 列表中 【参考方案1】:

可以这样做吗?我不熟悉巴巴罗斯的语法。如果这样更简洁更好。

select specialization, count(distinct claim_id) AS Claim_Totals, count(distinct claim_id)/total_claims
from table1 
INNER JOIN ( SELECT COUNT(DISTINCT claim_id)*1.0000 total_claims AS total_claims 
               FROM table1 ) TMP
   ON 1 = 1
group by specialization
order by Claim_Totals DESC


select specialization, 
       count(distinct claim_id) AS claim_by_spec,
       count(distinct claim_id)/
       ( SELECT COUNT(DISTINCT claim_id)*1.0000
               FROM table1 ) AS percentage_calc
from table1 
group by specialization
order by Claim_Totals DESC

【讨论】:

我在尝试运行时不断收到解析错误 @David 我猜蜂巢没有“交叉连接”。添加了一些替代方案。 感谢您的编辑,我认为这可行,但我得到的 percentage_calc 格式非常不理想(例如 6.434891e-8、0.00001241463087 等)。数据库很大,有没有办法让这个看起来像样?再次感谢 您确定要乘以 1.0000 而不是 10000? 我只是在介绍 hive 进行整数除法的可能性【参考方案2】:

您可以使用sum(count(distinct)) over() 获取总体声明,并将其用于分母以获取百分比。

select specialization
      ,count(distinct claim_id) AS Claim_Totals
      ,round(100*count(distinct claim_id)/sum(count(distinct claim_id)) over(),3) as percentage
from table1
group by specialization

【讨论】:

感谢发帖,我相信这可以正常工作,但percentage 列的格式非常混乱。有没有办法将其清理为仅包含 10.115%(或四舍五入到最接近的千分之一)? 对结果使用函数round,小数点后位数为所需位数。 您能告诉我如何将其构建到您的特定查询中吗?我对圆形函数不熟悉【参考方案3】:

你可以使用

,concat_ws('',count(distinct claim_id),'%') as percentage

,concat(count(distinct claim_id),'%') as percentage

添加到选择列表的尾部

顺便说一句,distinct 在选择列表中的特化之前是多余的,因为已经包含在 group by 列表中。

【讨论】:

我尝试运行两者,但他们只是给了我 Claim_Totals 列作为 %。我想让新列中的百分比与总索赔的总和成比例。抱歉,我最初的评论不是很清楚。 @David 您是否将选择列表添加为select specialization, count(distinct claim_id) AS Claim_Totals, concat(count(distinct claim_id),'%') as percentage 我用过:select specialization, count(distinct claim_id) AS Claim_Totals, concat(count(distinct claim_id),'%') as percentage from table1 group by specialization order by Claim_Totals DESC【参考方案4】:

因为您使用的是count(distinct),所以窗口函数的用处不大。你可以试试:

select t1.specialization,
       count(distinct t1.claim_id) AS Claim_Totals,
       count(distinct t1.claim_id) / tt1.num_claims
from table1 t1 cross join
     (select count(distinct claim_id) as num_claims
      from table1
     ) tt1
group by t1.specialization
order by Claim_Totals DESC

【讨论】:

以上是关于如何使用与计数不同语句相关的百分比创建附加列的主要内容,如果未能解决你的问题,请参考以下文章

如何将表与中间表和附加相关列spring hibernate mvc连接起来

如何使用关系和一些逻辑附加列 db 结果

如何使用计数窗口函数获取百分比?

如何获取列中值的不同百分比并将它们相加以分配到新的 SQL 列中?

如何在 INSERT 语句中使用存储过程的 OUTPUT?

如何使用 SQL 获取 2 列之间日期差异的计数(值的分布)?