Рассчитать% от общей суммы - красное смещение / sql - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь вычислить процентное содержание одного столбца по отношению ко второму итоговому столбцу.

Я написал:

create temporary table screenings_count_2018 as

select guid,
       datepart(y, screening_screen_date)                          as year,
       sum(case when screening_package = 4 then 1 end)             as count_package_4,
       sum(case when screening_package = 3 then 1 end)             as count_package_3,
       sum(case when screening_package = 2 then 1 end)             as count_package_2,
       sum(case when screening_package = 1 then 1 end)             as count_package_1,
       sum(case when screening_package in (1, 2, 3, 4) then 1 end) as count_total_packages


from prod.leasing_fact

where year = 2018
group by guid, year;

Эта таблица устанавливает столбцы начального и общего количества. Все столбцы выглядят правильно.

Затем я использую ratio_to_report для вычисления процента (ссылка на этот учебник):

create temporary table screenings_percentage as

    select
    guid,
    year,
    ratio_to_report(count_package_1) over (partition by count_total_packages) as percentage_package_1

from screenings_count_2018

group by guid, year,count_package_1,count_total_packages
order by percentage_package_1 desc;

Я тоже пробовал:

select
    guid,
    year,
    sum(count_package_1/count_total_packages) as percentage_package_1

    -- ratio_to_report(count_package_1) over (partition by count_total_packages) as percentage_package_1

from screenings_count_2018

group by guid, year,count_package_1,count_total_packages
order by percentage_package_1 desc;

К сожалению, процент_пакет_1 просто возвращает все нулевые значения (это не правильно - я ожидаю процентов). Ни один не работает.

Что я делаю не так?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

вам потребуется round(100.0*count_package_1/count_total_packages,1) и т. Д., Так как вы уже вычислили промежуточный итог и итого

0 голосов
/ 26 апреля 2019

Поскольку вы уже разложили столбцы с компонентами и итогом, при создании screenings_count_2018 вам действительно нужно использовать ratio_to_report?

select
    , guid
    , year
    , count_package_1/count_total_packages as percentage_package_1
    , count_package_2/count_total_packages as percentage_package_2
    , count_package_3/count_total_packages as percentage_package_3
    , count_package_4/count_total_packages as percentage_package_4
from screenings_count_2018

Это должно работать.NB вы гарантированно никогда не будете иметь count_total_packages ноль?Если это может быть ноль, вам нужно справиться с этим.Один из них - оператор case.

Если вы хотите, чтобы проценты для каждого пакета отображались в одном столбце, вы можете использовать ratio_to_report - это аналитическая функция "окна", и она будетбыть похожим на оригинальную таблицу.

with count_table as (
select guid
       , datepart(y, screening_screen_date) as year
       , screening_package
       , count(1) as count
from prod.leasing_fact
where year = 2018
group by guid
    , datepart(y, screening_screen_date)
    , screening_package
)
select guid
    , year
    , screening_package
    , ratio_to_report(count) over(partition by guid, year, screening_package) as perc_of_total
from count_table
...