SQL计算百分比

时间:2019-03-19 17:07:50

标签: sql subquery aggregate-functions percentage

我正在尝试为索赔少于100个的提供程序获取拒绝索赔的百分比计数(总数/拒绝计数* 100)。我可以通过单独的查询获得总数和拒绝计数,但是我无法将所有内容汇总在一起。

buildscript

结果示例:

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

由于选择语句中的子查询不允许我按提供者分组,因此所有内容的拒绝百分比均为零。

错误

  

当未使用EXISTS引入子查询时,只能在选择列表中指定一个表达式。

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

1 个答案:

答案 0 :(得分:1)

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

如何取决于您的SQL方言(MySQL,SQL Server,Oracle,PostgreSQL等)。

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)中。

这意味着要同时使用它们,您需要两对大括号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