Типичным фоновым рисунком SQL-метода для транспонирования (или поворота) является преобразование группы + в операторы сводного регистра подзапрос в группе агрегирующем запросе, которыйсворачивает подзапрос.Группа представляет собой одну результирующую сводную строку.
Например, ваша группа year, geog, category и min
используется для свертывания:
proc sql;
create view want_pivot as
select year, geog, category
, min(rate_m1) as rate_m1
, min(rate_m2) as rate_m2
from
( select
year, geog, category
, case when month=1 then rates end as rate_m1
, case when month=2 then rates end as rate_m2
from have
)
group by year, geog, category
;
ЗдесьЭто та же самая концепция, немного более общая, когда данные повторяются внутри группы на уровне детализации, а mean
используется для свертывания повторов.
data have;
input id name $ value;
datalines;
1 a 1
1 a 2
1 a 3
1 b 2
1 c 3
2 a 2
2 d 4
2 b 5
3 e 1
run;
proc sql;
create view have_pivot as
select
id
, mean(a) as a
, mean(b) as b
, mean(c) as c
, mean(d) as d
, mean(e) as e
from
(
select
id
, case when name='a' then value end as a
, case when name='b' then value end as b
, case when name='c' then value end as c
, case when name='d' then value end as d
, case when name='e' then value end as e
from have
)
group by id
;
quit;
Когда имена столбцов не известны априори, вам необходимо написать генератор кода, который передает все данные для определения значений имен, записывает запрос обоев, который выполнит второй проходданные, возвращающие стержень.
Кроме того, во многих современных базах данных есть предложение PIVOT, которое можно использовать с помощью сквозного прохода.
Сообщение Hadoop Mania "TRANSPOSE / PIVOT a Table inУлей " показывает использование collect_list
и map
в похожей обойной манере:
select b.id, b.code, concat_ws('',b.p) as p, concat_ws('',b.q) as q, concat_ws('',b.r) as r, concat_ws('',b.t) as t from
(select id, code,
collect_list(a.group_map['p']) as p,
collect_list(a.group_map['q']) as q,
collect_list(a.group_map['r']) as r,
collect_list(a.group_map['t']) as t
from ( select
id, code,
map(key,value) as group_map
from test_sample
) a group by a.id, a.code) b;