Как и в большинстве языков, если вы делаете 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