首页 > 解决方案 > 如何在 Oracle SQL 中将动态行转换为列

问题描述

我的数据如下:-

Item_ID 活动

1“店内”

1“在线”

1“商场”

1个“商店”

2“旗舰”

2“目的地”

我想将行转换为列,如下所示: -

Item_ID Column_1 Column_2 Column_3 Column_4

1 “店内” “网上” “商城” “商店”

2“旗舰”“目的地”

请有人指导我如何在 Oracle SQL 中执行上述操作?我已经尝试过 PIVOT 函数,但它需要静态(硬编码)值列表。

一个项目最多可以有 4 个活动,但活动中的值可以是任何值(我在活动列中有 135 个唯一值,活动列表是动态的)。

标签: sqloracle

解决方案


您可以为每个项目 ID 的每个活动分配一个排名/行号:

select item_id, activity,
  row_number() over (partition by item_id order by activity) as rn
from your_table

然后将该值用于枢轴:

select *
from (
  select item_id, activity,
    row_number() over (partition by item_id order by activity) as rn
  from your_table
)
pivot (max(activity) for (rn) in (1, 2, 3, 4))
ITEM_ID 1 2 3 4
1 有存货 购物中心 在线的 商店
2 目的地 旗舰

db<>小提琴

实际活动值无关紧要,枢轴仅基于数值。如果需要,这也可以很容易地显示第五列 - 只需将 5 添加到列表中。

如果每个项目的活动顺序很重要,那么您需要在order by子句中指定;仅从您提供的两列中,没有其他要排序的内容,因此我将它们按字母顺序排列,但是您可能还有其他规则和数据可以让您进行其他排序。


推荐阅读