我试图获得不足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引入子查询时,只能在选择列表中指定一个表达式。
什么是最好的方法?
根据大多数语言,如果你用整数做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