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
我正在尝试为少于 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