Вычисление процента по группам с использованием Teradata

#sql #sas #teradata

#sql #sas #teradata

Вопрос:

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

Вот пример набора данных, который я использую для создания моей новой таблицы.

  ------------- ------- ------- 
|  Indicator  | State | Count | 
 ------------- ------- ------- 
| Registered  | CA    |    25 |
| Registered  | FL    |    12 |
| Total       | CA    |    50 |
| Total       | FL    |    36 |
 ------------- ------- ------- 

  

Я пытаюсь создать новую таблицу, в которой для каждой соответствующей строки был бы процент, подобный этому:

  ------------- ------- ------- ------------ 
|  Indicator  | State | Count | Percentage |
 ------------- ------- ------- ------------ 
| Registered  | CA    |    25 |         50 |
| Registered  | FL    |    12 |       33.3 |
| Total       | CA    |    50 |          . |
| Total       | FL    |    36 |          . |
 ------------- ------- ------- ------------ 
  

До сих пор я пытался выполнить приведенный ниже запрос:

 select indicator, state, count
, case when (select count from table where indicator='Registered') * 100 / (select count from table where indicator='Total')
when indicator = 'Total' then . end as Percentage

from table;

  

Это не работает, потому что я получаю сообщение об ошибке: «Подзапрос оценил более одной строки». Я предполагаю, что это потому, что я не принимаю во внимание состояние в операторе case when, но я не уверен, как бы я поступил по этому поводу.

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

Комментарии:

1. Разве вы просто не выполняете объединение между набором записей с Indicator=’Total’ и остальными?

Ответ №1:

Просто соедините таблицу обратно с самой собой.

 select a.indicator, a.state, a.count
     , case when (indicator='Total') then null
            else 100 * a.count/b.count 
       end as Percentage
from table a
inner join (select state,count from table where indicator='Total') b 
  on a.state = b.state
;
  

Ответ №2:

Вы можете использовать оконные функции:

 select t.*,
       (case when indicator <> 'Total'
             then count * 100.0 / sum(case when indicator = 'Total' then indicator end) over (partition by state)
        end) as percentage
from t;
  

Комментарии:

1. Не уверен, что я понимаю. Я не вижу оконной функции в опубликованном вами коде. Мне также интересно, как я собираюсь использовать функцию sum так, как вы опубликовали, поскольку для этого потребуется числовой аргумент.

2. @dw0000 . . . Теперь это есть.