Oracle - 扁平化数据
ORACLE - FLATTEN DATA
我确定以前有人问过这个问题,但可能不是这样。
这是数据:
我需要展平行和最终输出:
有什么想法吗?
正如你已经说过的,我们完全可以在这里使用row_number
然后使用row_number
到pivot
它,
select *
from
(
select userid,make,model,
row_number() over (partition by userid order by make,model) rn
from table1
)
pivot
(
max(make) make,max(model) model
for rn in (1,2,3,4,5)
)
或
使用条件聚合,许多人更喜欢 PIVOT
select userid
,max(case when rn = 1 then make end) make_1
,max(case when rn = 1 then model end) model_1
,max(case when rn = 2 then make end) make_2
,max(case when rn = 2 then model end) model_2
,max(case when rn = 3 then make end) make_3
,max(case when rn = 3 then model end) model_3
from
(
select userid,make,model,
row_number() over (partition by userid order by make,model) rn
from table1
)
group by userid;
在这两种情况下,您可以说缺点是对行号进行硬编码,但这就是它的工作原理,否则您可以根据需要选择动态 SQL。
我确定以前有人问过这个问题,但可能不是这样。
这是数据:
我需要展平行和最终输出:
有什么想法吗?
正如你已经说过的,我们完全可以在这里使用row_number
然后使用row_number
到pivot
它,
select *
from
(
select userid,make,model,
row_number() over (partition by userid order by make,model) rn
from table1
)
pivot
(
max(make) make,max(model) model
for rn in (1,2,3,4,5)
)
或
使用条件聚合,许多人更喜欢 PIVOT
select userid
,max(case when rn = 1 then make end) make_1
,max(case when rn = 1 then model end) model_1
,max(case when rn = 2 then make end) make_2
,max(case when rn = 2 then model end) model_2
,max(case when rn = 3 then make end) make_3
,max(case when rn = 3 then model end) model_3
from
(
select userid,make,model,
row_number() over (partition by userid order by make,model) rn
from table1
)
group by userid;
在这两种情况下,您可以说缺点是对行号进行硬编码,但这就是它的工作原理,否则您可以根据需要选择动态 SQL。