我有 2 个计算存储桶列的数据,我想用 PIVOT 查询进行总结。这是一组预先生成的数据示例。我这里的存储桶列是 sec 和 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
输出应该是这样的
猫 | lt_1_秒 | lt_2_秒 | lt_25_pct | lt_50_pct | lt_75_pct |
---|---|---|---|---|---|
A | 2 | 4 | 3 | 2 | 1 |
我想独立地关注 sec 和 pct 的值。我可以使用枢轴子句来完成此操作,或者使用所有 sec 值按所有 pct 值进行排列,但不能同时独立地完成此操作。
我尝试过多个pivot子句,它会创建一些意外的行为,pivot-for子句中的多个值,它创建所有值的排列,以及多个聚合函数,它仅在单个列上执行多个聚合选项。
具有多个主元子句的非功能示例(返回的数据不正确):
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;
猫 | 总和(LT_1_SEC) | 总和(LT_2_SEC) | 总和(LT_25_PCT) | 总和(LT_50_PCT) | 总和(LT_75_PCT) |
---|---|---|---|---|---|
A | 2 | 4 | 1 | 1 | 1 |
具有多个主元值的非功能示例二(不应产生所有值组合的排列)
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));
猫 | 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 |
具有多个聚合函数的非功能示例三(仅为 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));
猫 | 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 |
难道真的没有办法在同一查询中对不同的值集执行多个透视而不排列值吗?
团体 | 枢轴_1_a | 枢轴_1_b | 枢轴_2_x | 枢轴_2_y | 枢轴_2_z | ||
---|---|---|---|---|---|---|---|
A | cnt_a | cnt_b | cnt_x | cnt_y | cnt_z |
其中 A+B = X+Y+Z = count()
同样的查询?是的。
相同的
pivot
?不。注意表别名位于
pivot
(您还需要删除重复的
cat
列)