#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 . . . Теперь это есть.