将少列id行复制到多列唯一id行oracle sql

2guxujil  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(327)

我有一张table,上面可以放一到四盏路灯。每行都有一个杆id和路灯的类型(描述)。我需要的id是唯一的,每一个可能的路灯列。类型/描述可以是26个字符串中的任意一个。
我有这样的想法:

ID   Description
----------------
1    S 400
1    M 200
1    HPS 1000
1    S 400
2    M 400
2    S 250
3    S 300

我需要的是:

ID   Description_1   Description_2   Description_3   Description_4
------------------------------------------------------------------
1    S 400           M 200           HPS 1000        S 400
2    M 400           S 250
3    S 300

描述在描述列中填充的顺序并不重要,例如,对于id=1,hps 1000值可能在描述列1、2、3或4中。所以,只要所有的值都存在。
我试着转动它,但我不认为这是正确的工具。

select * from table t
pivot (
max(Description) for ID in (1, 2, 3))

因为有~3000个ID,我最终会得到一个~3001行宽的表。。。
我还研究了这个oraclesql交叉表查询,但情况并不完全相同。
解决这个问题的正确方法是什么?

kupeojn6

kupeojn61#

你可以用 row_number() 和条件聚合:

select 
    id,
    max(case when rn = 1 then description end) description_1,
    max(case when rn = 2 then description end) description_2,
    max(case when rn = 3 then description end) description_3,
    max(case when rn = 4 then description end) description_4
from (
    select t.*, row_number() over(partition by id order by description) rn
    from mytable t
) t
group by id

这最多可以处理4个描述 id . 要处理更多内容,只需扩展 select 多条件从句 max() s。

相关问题