【发布时间】:2021-08-07 08:46:08
【问题描述】:
我有一个包含 150 多个数据的表(能力),用户可以随时插入或更新这些数据。 我想将此表的行转换为列并创建另一个视图。此视图应具有作为员工的行,其中员工表是单独定义的。 我尝试使用 PIVOT 函数,但无法解决如何定义列,因为它将是动态的。
原始表
| competency_id | competency_group | organization | position | job |
|---|---|---|---|---|
| ENGLISH | LANGUAGE | my_org | my_pos | my_Job |
| FRENCH | LANGUAGE | my_org | my_pos | my_Job |
| JAPANESE | LANGUAGE | my_org | my_pos | my_Job |
新视图(预期)
| ENGLISH | FRENCH | JAPANESE |
|---|---|---|
| ------- | ------ | -------- |
| ------- | ------ | -------- |
| ------- | ------ | -------- |
编辑 当我像下面这样尝试时,它适用于指定的列
select * from (
select competency_id
from competency_tab t
)
pivot
(
count(competency_id)
for competency_id in ('ENGLISH', 'GERMAN')
)
但是当我尝试使用下面的 select 语句时,它给出了一个错误
select * from (
select competency_id
from competency_tab t
)
pivot
(
count(competency_id)
for competency_id in (SELECT DISTINCT competency_id FROM competency_tab)
)
【问题讨论】:
-
我记得在 MSSQL 中做过类似的事情,这是通过动态构建 SQL 字符串并使用
EXEC命令执行它来完成的。动态查询使用了PIVOT命令。由于这是在 MSSQL 中完成的,因此可能无济于事,但您可能必须动态创建 SQL。 -
如果您查看 PIVOT 的工作原理并使其与示例表一起工作,那么您将知道在构建 SQL 字符串时需要做什么。基本上,您需要一个可以让您区分
competency_id的查询,以便您可以将其注入到 Pivot SQL 字符串中。 -
@MichaelZ。我编辑了这个问题,如果你对此有任何想法
-
你成功了!你的第一个 SQL 工作。您需要执行不同的查询以在
for行中构建该列表。它必须是nvarchar变量中的一个并使用EXEC @myVar执行 -
这能回答你的问题吗? Dynamic pivot in oracle sql 好像每天都在问这个问题。
标签: sql oracle plsql pivot dynamic-pivot