SQL расчетный процент - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь получить процент отклоненных претензий (total_count / denied_count * 100) для провайдеров с менее чем 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.

Ошибка

Только одно выражение может быть указано в списке выбора, если подзапрос не введен с EXISTS.

Какой лучший способ сделать это ??

1 Ответ

1 голос
/ 19 марта 2019

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