在Oracle PL/SQL中创建查询以从单个列中提取值并将其排列到各个列中需要帮助

7hiiyaii  于 2023-06-05  发布在  Oracle
关注(0)|答案(2)|浏览(374)

我正在为一个提要写一个摘录,接收系统希望将单个列中的值排列在各个列中。
以下是数据的存储方式:
| 人员ID|业余爱好|
| - -----|- -----|
| 一百二十三|园艺|
| 一百二十三|徒步旅行|
| 一百七十六|阅读|
| 三六六|徒步旅行|
| 三六六|园艺|
| 三六六|足球|
下面是我需要查询生成的内容。请注意,我需要它以查询的形式出现,以便每天晚上都能运行它来提取提要。还要注意,爱好需要按asc排序,因此每个人的每一列可能会有不同的值,如下所示:
| 人员ID|爱好1|爱好2|爱好3|爱好4|爱好5|爱好6|
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|
| 一百二十三|园艺|徒步旅行|||||
| 一百七十六|阅读||||||
| 三六六|足球|园艺|徒步旅行||||
就像是listagg的反义词我被卡住了。任何帮助将不胜感激!
我试着对爱好进行排序并返回第一行,但我不知道如何获得第2-6行。
在每个人都跳到我问另一个透视表问题之前,这不是求和值,列也没有定义(园艺y/n,徒步y/n等),所以我以前使用的透视表代码不适用于这种情况-除非我想错了??

mbyulnm0

mbyulnm01#

我只需要为每一个派生一个行号,然后使用条件聚合。

select
  person,
  max(case when rn = 1 then hobby else null end) as hobby1,
  max(case when rn = 2 then hobby else null end) as hobby2,
  max(case when rn = 3 then hobby else null end) as hobby3
from 
(
  select
    person,
    hobby,
    row_number() over (partition by person order by hobby) as rn
  from foo
) t
group by person;

Fiddle

fcipmucu

fcipmucu2#

这是使用PIVOT的另一种方法:

with cte as (
  select person, hobby,
  row_number() over (partition by person order by hobby) as rn
  from mytable
)
select *
from cte
pivot 
(  max(HOBBY)
   for rn in (1 as "hobby1", 2 as "hobby2", 3 as "hobby3", 4 as "hobby4", 5 as "hobby5", 6 as "hobby6")
)

结果:

PERSON  hobby1      hobby2     hobby3   hobby4  hobby5  hobby6
123     Gardening   Hiking     null     null    null    null
176     Reading     null       null     null    null    null
345     Football    Gardening  Hiking   null    null    null

Demo here

相关问题