我正在尝试为索赔少于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引入子查询时,只能在选择列表中指定一个表达式。
解决此问题的最佳方法是什么?
答案 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