【问题标题】:How to Convert Dynamic Rows to Columns in Oracle SQL如何在 Oracle SQL 中将动态行转换为列
【发布时间】:2021-07-07 19:54:15
【问题描述】:

我的数据如下:-

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 个唯一值,活动列表是动态的)。

【问题讨论】:

标签: sql oracle


【解决方案1】:

您可以为每个项目 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 In-Store Mall Online Shops
2 Destination Flagship

db<>fiddle

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

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

【讨论】:

  • 嗨,Alex:这非常有用。 ITEM_ID 2 只有 2 个活动,但使用 SQL 将 Destination 分配给第 1 列,将 Flagship 分配给第 2、3 和 4 列。对于 ITEM_ID=2,我们如何将第 3 和 4 列保持为 NULL?非常感谢!!!!
  • 它没有这样做 - 你可以在上面和小提琴中看到结果。也许您的数据有重复的活动;或者您的版本在内部查询中有一个连接,并且产生的行数比您想象的要多?使用 dense_rank 而不是 row_number 应该可以解决它。
  • 非常感谢,亚历克斯!上面的 SQL 答案解决了这个问题。
猜你喜欢
  • 2021-08-07
  • 2015-04-17
  • 2022-01-17
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多