【问题标题】:Oracle SQL - Converting rows into columns dynamically [duplicate]Oracle SQL - 动态将行转换为列[重复]
【发布时间】: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


【解决方案1】:

我知道您没有使用 MSSQL,但是这个概念可能会对您有所帮助。

我不确定,但你可能需要LISTAGG 来代替STRING_AGG。我只是想在这里传达这个概念。

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

【讨论】:

    猜你喜欢
    • 2020-02-23
    • 2014-04-13
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多