Разделение и подзапрос в select - PullRequest
0 голосов
/ 20 февраля 2020

Я хочу разделить общее количество счетов из таблицы 'ed' на таблицу 'e', ​​и я получаю ноль, таблица 'ed' имеет 16784 счета, а таблица 'e' имеет 41601 учетных записей, поэтому я хочу разделить 16784 / 41601 но я получаю ноль в выходе, не уверен, что я делаю неправильно.

SELECT count(distinct ed.accountnumber)/(select count(distinct e.accountnumber) as totalaccts from revenueanalytics.dbo.EPICDATA e) as totalaccounts

                from revenueanalytics.dbo.EPICDATA ed

                where ed.NEW_AGING_GROUP in ('91-120','121-180','181-365','366+')

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Вы сталкиваетесь с целочисленным делением: оба операнда являются целочисленными, поэтому база данных выполняет вычисления в целочисленном контексте (и, следовательно, возвращает целочисленное значение).

Чтобы избежать этого, вы можете просто умножить одно из значений с десятичным числом, поэтому это приводит к десятичному контексту в вычислениях.

Кроме того, вы можете избежать необходимости подзапроса, используя условное агрегирование: это работает путем перемещения фильтрации в функции агрегирования, например, так:

select 
    1.0 
        * count(distinct 
            case when new_aging_group in ('91-120','121-180','181-365','366+') 
            then ed.accountnumber 
        end)
        / count(distinct e.accountnumber)
        as totalaccounts
from revenueanalytics.dbo.epicdata
0 голосов
/ 20 февраля 2020

Если вы хотите, чтобы соотношение этих чисел в той же таблице , то самый простой способ - использовать avg() с условными логами c:

select avg(case when ed.NEW_AGING_GROUP in ('91-120', '121-180', '181-365', '366+')
                then 1.0 else 0
           end) as ratio
from revenueanalytics.dbo.EPICDATA ed;

Это предполагает что вам действительно не нужно count(distinct).

...