【问题标题】:Dynamically create columns in select SQL Oracle在选择 SQL Oracle 中动态创建列
【发布时间】:2021-08-26 12:12:24
【问题描述】:

我想在一行中显示研究者姓名头衔

如何将 title 列动态设置为 title1title2title 3 等在 SQL Oracle 中?

头衔的数量可以变化,所以如果有一个调查员有 4 个头衔,那么会有 4 列 title1title2title3, title4.

这是我当前的查询:

SELECT al.name, al.title_name FROM INVESTIGATOR a1

【问题讨论】:

  • 您可以旋转,正如您似乎从标签中知道的那样;但是每个名称是否有最大数量的标题值?如果有,那么它不需要是动态的。它们的顺序是否重要?目前尚不清楚它们是按字母顺序排列、随机排列(在示例中恰好是字母顺序),还是有另一列决定了它们的优先级。
  • 谢谢 Alex.. 但是如何命名我的列 Title1、title2、title3...? Pivot 会将这些列命名为 AP、AR、AS,对吗?标题的顺序无关紧要。标题没有最大数量,但通过查看数据,我想我可以将其设置为固定数字......如果没有任何标题,它只会显示空白。

标签: sql oracle dynamic-sql dynamic-pivot


【解决方案1】:

标题没有最大数量,但通过查看数据我想我可以将其设置为固定数量

如果您可以选择最大数量的标题,那么您不需要动态地执行此操作。

如果您对每个名称的每个标题应用排名,例如:

select name,
  title_name,
  dense_rank() over (partition by name order by title_name) as rnk
from investigator

这会将它们按字母顺序排列,但如果您愿意,可以选择不同的顺序;然后你旋转那个查询的结果:

select *
from (
  select name,
    title_name,
    dense_rank() over (partition by name order by title_name) as rnk
  from investigator
)
pivot (
  max(title_name)
  for (rnk) in (
    1 as title1, 2 as title2, 3 as title3, 4 as title4
  )
)

我最多添加了四个标题,但您可以添加任意数量的标题。

如何命名我的列 Title1、title2、title3...

我已经在 pivot 的 in() 子句中使用了别名。

使用提供输出的示例数据:

NAME TITLE1 TITLE2 TITLE3 TITLE4
---- ------ ------ ------ ------
Abu  AP     AR     AS
Cu   TA
Gyu  AP

如果您不在 11g 或更高版本上,那么您可以进行手动转换,这也是 Oracle 在幕后所做的基本工作:

select name,
  max(case when rnk = 1 then title_name end) as title1,
  max(case when rnk = 2 then title_name end) as title2,
  max(case when rnk = 3 then title_name end) as title3,
  max(case when rnk = 4 then title_name end) as title4
from (
  select name,
    title_name,
    dense_rank() over (partition by name order by title_name) as rnk
  from investigator
)
group by name

得到相同的结果。

db<>fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 2020-10-06
    • 2021-10-08
    • 2017-03-14
    • 2020-08-29
    • 1970-01-01
    • 2021-10-20
    相关资源
    最近更新 更多