SQL计算百分比

问题描述 投票:0回答:1

我试图获得不足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语句中的子查询不允许我按照提供分组,因此我对所有内容的拒绝百分比为零。

错误

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

什么是最好的方法?

sql subquery aggregate-functions percentage
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.