如何解决Oracle SQL - 将行动态转换为列
我有一个包含 150 多个数据的表(能力),用户可以随时插入或更新这些数据。 我想将此表的行转换为列并创建另一个视图。此视图应将行作为员工,其中员工表是单独定义的。 我尝试使用 PIVOT 函数,但无法解决如何定义列,因为它是动态的。
原表
competency_id | competency_group | 组织 | 位置 | 工作 |
---|---|---|---|---|
英文 | 语言 | my_org | my_pos | my_Job |
法语 | 语言 | my_org | my_pos | my_Job |
日语 | 语言 | my_org | my_pos | my_Job |
新视图(预期)
英文 | 法语 | 日语 |
---|---|---|
------- | ------ | -------- |
------- | ------ | -------- |
------- | ------ | -------- |
编辑 当我像下面这样尝试时,它适用于指定的列
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,但是这个概念可能会对您有所帮助。
我不确定,但您可能需要 STRING_AGG
来代替 LISTAGG
。我只是想在这里传达这个概念。
CREATE PROCEDURE PivotMyTable
AS
BEGIN
DECLARE @cols NVARCHAR(MAX) = '';
DECLARE @sql NVARCHAR(MAX) = 'select * from (select competency_id from competency_tab t) pivot (count(competency_id) for competency_id in (##COLUMS##))'
WITH T
AS
(SELECT DISTINCT
competency_id
FROM competency_tab)
SELECT
@cols = STRING_AGG(QUOTENAME(T.competency_id,''''),',')
FROM T
SET @sql = REPLACE(@sql,'##COLUMNS##',@cols);
EXEC @sql;
END
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。