Tenho dados com duas colunas de intervalo calculadas que gostaria de resumir com uma consulta PIVOT. Este é um exemplo de conjunto de dados pré-gerados. Minhas colunas de balde aqui são segundos e pct.
select '1' id, 'a' cat, 'lt_1_sec' sec, 'lt_25_pct' pct from dual
union all
select '2', 'a' cat, 'lt_1_sec', 'lt_25_pct' from dual
union all
select '3', 'a' cat, 'lt_2_sec', 'lt_25_pct' from dual
union all
select '4', 'a' cat, 'lt_2_sec', 'lt_50_pct' from dual
union all
select '5', 'a' cat, 'lt_2_sec', 'lt_50_pct' from dual
union all
select '6', 'a' cat, 'lt_2_sec', 'lt_75_pct' from dual
A saída deve ficar assim
gato | lt_1_seg | lt_2_seg | lt_25_pct | lt_50_pct | lt_75_pct |
---|---|---|---|---|---|
a | 2 | 4 | 3 | 2 | 1 |
Eu gostaria de focar nos valores de sec e pct de forma independente. Sou capaz de usar uma cláusula pivô para fazer isso em um ou outro, ou uma permutação de todos os valores de sec por todos os valores de pct, mas não de forma independente e simultânea.
Eu tentei várias cláusulas pivot, que criam algum comportamento inesperado, vários valores na cláusula pivot-for, que cria uma permutação de todos os valores, e múltiplas funções de agregação, que executam apenas múltiplas opções de agregação em uma única coluna.
Exemplo não funcional um com múltiplas cláusulas pivot (os dados retornados estão incorretos):
with dummy_data as (
select cat, sec, pct
from (
select '1' id, 'a' cat, 'lt_1_sec' sec, 'lt_25_pct' pct
from dual
union all
select '2', 'a' cat, 'lt_1_sec', 'lt_25_pct'
from dual
union all
select '3', 'a' cat, 'lt_2_sec', 'lt_25_pct'
from dual
union all
select '4', 'a' cat, 'lt_2_sec', 'lt_50_pct'
from dual
union all
select '5', 'a' cat, 'lt_2_sec', 'lt_50_pct'
from dual
union all
select '6', 'a' cat, 'lt_2_sec', 'lt_75_pct'
from dual
)
),
dummy_pvt as (
select *
from dummy_data pivot (count(*) for (sec) in ('lt_1_sec' as lt_1_sec,
'lt_2_sec' as lt_2_sec)) pivot (count(*) for (pct) in ('lt_25_pct' as lt_25_pct,
'lt_50_pct' as lt_50_pct,
'lt_75_pct' as lt_75_pct))
)
select cat, sum(lt_1_sec), sum(lt_2_sec), sum(lt_25_pct), sum(lt_50_pct), sum(lt_75_pct)
from dummy_pvt
group by cat;
GATO | SOMA(LT_1_SEC) | SOMA(LT_2_SEC) | SOMA(LT_25_PCT) | SOMA(LT_50_PCT) | SOMA(LT_75_PCT) |
---|---|---|---|---|---|
a | 2 | 4 | 1 | 1 | 1 |
Exemplo não funcional dois com vários valores pivot-for (não deve produzir uma permutação de todas as combinações de valores)
with dummy_data as (
select cat, sec, pct
from (
select '1' id, 'a' cat, 'lt_1_sec' sec, 'lt_25_pct' pct
from dual
union all
select '2', 'a' cat, 'lt_1_sec', 'lt_25_pct'
from dual
union all
select '3', 'a' cat, 'lt_2_sec', 'lt_25_pct'
from dual
union all
select '4', 'a' cat, 'lt_2_sec', 'lt_50_pct'
from dual
union all
select '5', 'a' cat, 'lt_2_sec', 'lt_50_pct'
from dual
union all
select '6', 'a' cat, 'lt_2_sec', 'lt_75_pct'
from dual
)
)
select *
from dummy_data pivot (count(*) for (sec, pct) in (
('lt_1_sec', 'lt_25_pct') as lt_1_25,
('lt_1_sec', 'lt_50_pct') as lt_1_50,
('lt_1_sec', 'lt_75_pct') as lt_1_75,
('lt_2_sec', 'lt_25_pct') as lt_2_25,
('lt_2_sec', 'lt_50_pct') as lt_2_50,
('lt_2_sec', 'lt_75_pct') as lt_2_75));
GATO | LT_1_25 | LT_1_50 | LT_1_75 | LT_2_25 | LT_2_50 | LT_2_75 |
---|---|---|---|---|---|---|
a | 2 | 0 | 0 | 1 | 2 | 1 |
Exemplo não funcional três com múltiplas funções agregadas (cria apenas colunas para os valores sec)
with dummy_data as (
select cat, sec, pct
from (
select '1' id, 'a' cat, 'lt_1_sec' sec, 'lt_25_pct' pct
from dual
union all
select '2', 'a' cat, 'lt_1_sec', 'lt_25_pct'
from dual
union all
select '3', 'a' cat, 'lt_2_sec', 'lt_25_pct'
from dual
union all
select '4', 'a' cat, 'lt_2_sec', 'lt_50_pct'
from dual
union all
select '5', 'a' cat, 'lt_2_sec', 'lt_50_pct'
from dual
union all
select '6', 'a' cat, 'lt_2_sec', 'lt_75_pct'
from dual
)
)
select *
from dummy_data pivot (count(sec) sec_cnt, count(pct) pct_cnt for (sec) in (
('lt_1_sec') as lt_1_sec,
('lt_2_sec') as lt_2_sec));
GATO | LT_1_SEC_SEC_CNT | LT_1_SEC_PCT_CNT | LT_2_SEC_SEC_CNT | LT_2_SEC_PCT_CNT |
---|---|---|---|---|
a | 2 | 2 | 4 | 4 |
Não há realmente nenhuma maneira de realizar vários pivôs em conjuntos separados de valores na mesma consulta sem permutar os valores?
grupo | pivô_1_a | pivô_1_b | pivô_2_x | pivô_2_y | pivô_2_z | ||
---|---|---|---|---|---|---|---|
a | cnt_a | cnt_b | cnt_x | cnt_y | cnt_z |
Onde A+B = X+Y+Z = contagem()