首页 > 解决方案 > SQL 列百分比(具有多个分组依据)

问题描述

语境

我有这个视图/展览,其中列出了发送日期、客户姓名、客户职位、拒绝类型、IDClientPosition 总数和 IDRefusal 总数的记录。我用它来检查每个日期发送的索赔数量、被接受、拒绝的数量以及每个客户拒绝的原因。(我有用于 ClientPosition、Refusal 和 Client 的相关表)

  DtSent    |  IDClient | IDClientPosition | TOTAL Position | IDRefusal | TOTAL Refusal
---------------------------------------------------------------------------------------------
2020-01-10         1             1                 40           NULL           0
2020-01-10         1             1                 3              7            3
2020-01-10         1             2                 1            NULL           0
2020-02-10         2             2                 27             1           27
2020-02-10         2             2                 13             2           13    

查询到目前为止,显示上述值:

SELECT        TOP (100) PERCENT dbo.LBA.DtSent, dbo.Claims.IDClient, dbo.LBA.IDClientPosition, 
           COUNT(dbo.LBA.IDClientPosition) AS [TOTAL Position], dbo.LBA.IDRefusal, 
           COUNT(dbo.LBA.IDRefusal) AS [TOTAL Refusal]
FROM            dbo.LBA INNER JOIN
             dbo.ClientPositionLBA ON dbo.LBA.IDClientPosition = 
             dbo.ClientPositionLBA.IDClientPositLBA LEFT OUTER JOIN
             dbo.RefusalLBA ON dbo.LBA.IDRefusal = dbo.RefusalLBA.IDRefusal LEFT OUTER JOIN
             dbo.Claims LEFT OUTER JOIN
             dbo.Clients ON dbo.Claims.IDClient = dbo.Clients.IDClients ON 
             dbo.LBA.ClaimID = dbo.Claims.ClaimID
GROUP BY dbo.LBA.IDClientPosition, dbo.Claims.IDClient, dbo.LBA.IDRefusal, dbo.LBA.DtSent

我想要什么

我想根据 TOTAL Position 和 TOTAL Refusal 的值添加 2 列百分比。

有了这个,除了我已经拥有的总值(计数)之外,我还可以知道每个客户在该日期接受、拒绝了多少索赔的百分比以及有什么理由(IDRefusal)。总而言之,这就像将这些总值转换为百分比。

每个客户每个月应该有大约 100 条记录,总共 20 个客户,所以它必须考虑性能。我尝试过在网上找到的零散的东西,但没有用。

标签: sqlgroup-bypercentage

解决方案


只需除以总数:

COUNT(dbo.LBA.IDClientPosition) * 1.0 / COUNT(*),
COUNT(dbo.LBA.IDRefusal) * 1.0 / COUNT(*)

* 1.0是因为某些数据库会进行整数除法。* 1.0产生一个带小数的数字,因此计算更准确。


推荐阅读