SQL 计算百分比

SQL calculating percentage

我正在尝试为少于 100 项索赔的提供商计算索赔被拒绝的百分比计数 (total_count / denied_count * 100)。我能够通过单独的查询获得总计数和拒绝计数,但我无法将所有内容组合在一起。

SELECT
    PROVID,
    COUNT(CLAIMID) AS TOTAL_COUNT,
    COUNT(CLAIMID) / (SELECT COUNT(CLAIMID) * 100 
                      FROM #TEMPSTAGE 
                      WHERE STATUS = 'DENY') AS DENIED_PERCENTAGE
FROM 
    #TEMPSTAGE
WHERE 
    PROVID IN (SELECT DISTINCT PROVID
               FROM #TEMPSTAGE
               GROUP BY PROVID
               HAVING COUNT(CLAIMID) <= 100)
GROUP BY 
    PROVID

结果示例:

ProvID / Total_Count / Denied Percentage
-----------------------------------------    
X12345  / 77       /     0

由于我在 select 语句中的子查询不允许我按 provid 分组,所以我得到的所有内容的拒绝百分比都是零。

错误

Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

解决此问题的最佳方法是什么?

根据大多数语言,如果您对整数执行 1 / 2,结果是 0,因为 0.5 没有整数。要获得小数(浮点的固定点),您需要转换数据类型。

如何取决于你的方言 SQL (MySQL, SQL Server, Oracle, PostgreSQL, etc).

CAST(COUNT(CLAIMID) AS FLOAT)

CAST(COUNT(CLAIMID) AS DECIMAL(10, 4))

COUNT(CLAIMID) * 1.0

etc, etc

接下来,要使用 IN,列表需要放在大括号 IN (1, 2, 3) 中,但是要使用子查询,查询需要放在大括号 (SELECT x FROM y).[=26= 中]

这意味着你需要两副牙套才能同时使用它们IN ((SELECT x FROM y))

因此,对查询的最小更改是...

SELECT
    PROVID,
    COUNT(CLAIMID) AS TOTAL_COUNT,
    COUNT(CLAIMID) / (SELECT COUNT(CLAIMID) * 100.0
                      FROM #TEMPSTAGE
                      WHERESTATUS = 'DENY') AS DENIED_PERCENTAGE
FROM 
    #TEMPSTAGE
WHERE 
    PROVID IN ((SELECT PROVID
               FROM #TEMPSTAGE
               GROUP BY PROVID
               HAVING COUNT(CLAIMID) <= 100))
GROUP BY 
    PROVID

也就是说,where子句中的子查询可以移到主查询中...

SELECT
    PROVID,
    COUNT(CLAIMID) AS TOTAL_COUNT,
    COUNT(CLAIMID) / (SELECT COUNT(CLAIMID) * 100.0
                      FROM #TEMPSTAGE 
                      WHERE STATUS = 'DENY') AS DENIED_PERCENTAGE
FROM 
    #TEMPSTAGE
GROUP BY 
    PROVID
HAVING
    COUNT(CLAIMID) <= 100

另外,我删除了 DISTINCT 关键字。如果您按原样使用 GROUP BY,则不需要它。

已编辑:关注评论

可以跳过子查询,只对状态为'DENY'.

的组中的行数求和

另外,百分比是(x * 100) / y而不是x / (y * 100),所以我倒推了计算。

SELECT
    PROVID,
    COUNT(CLAIMID) AS TOTAL_COUNT,
    SUM(CASE WHEN STATUS = 'DENY' THEN 1 ELSE 0 END) * 100.0 / COUNT(CLAIMID) AS DENIED_PERCENTAGE
FROM 
    #TEMPSTAGE
GROUP BY 
    PROVID
HAVING
    COUNT(CLAIMID) <= 100