在 Oracle SQL 中生成动态列值

Posted

技术标签:

【中文标题】在 Oracle SQL 中生成动态列值【英文标题】:Generating dynamic column values in Oracle SQL 【发布时间】:2016-04-09 20:06:57 【问题描述】:

我想从我的数据中存在的列之一动态创建列。在下面的情况下,我需要按 run_date 对数据进行分组,并将每个 marketplace_code 作为列名。

所以基本上我需要转换这些数据:

run_date,  marketplace_code,    count
06-APR-16,  US,                 1125197     
06-APR-16,  MX,                 26873   
06-APR-16,  IT,                 5197        
06-APR-16,  UK,                 23873   
05-APR-16,  US,                 486889
05-APR-16,  MX,                 486819
05-APR-16,  IT,                 536889
05-APR-16,  UK,                 986819

变成这样的东西:

run_date,   US,         MX,     IT,     UK
06-APR-16,  1125197,    26873,  5197,   23873
05-APR-16,  486889,     486819, 536889, 986819

我尝试使用 pivot 但我不知道如何解决这个问题。此外,我们需要考虑市场代码的数量不是固定的,并且可能会增加。提前致谢。

【问题讨论】:

谷歌:“Oracle 动态枢轴” 【参考方案1】:

静态数据透视值的 SQL

SELECT run_date,
       MAX( CASE marketplace_code WHEN 'US' THEN "count" END ) AS US,
       MAX( CASE marketplace_code WHEN 'MX' THEN "count" END ) AS MX,
       MAX( CASE marketplace_code WHEN 'IT' THEN "count" END ) AS IT,
       MAX( CASE marketplace_code WHEN 'UK' THEN "count" END ) AS UK
FROM   you_table
GROUP BY run_date;

PL/SQL 用于动态透视值

VARIABLE cur REFCURSOR;

DECLARE
  TYPE string_table IS TABLE OF VARCHAR2(4000);
  t_codes    string_table;
  p_sql      CLOB;
BEGIN
  SELECT DISTINCT marketplace_code
  BULK COLLECT INTO t_services, t_counts
  FROM   your_table;

  p_sql := EMPTY_CLOB() || 'SELECT run_date';
  FOR i IN 2 .. t_codes.COUNT LOOP
    p_sql := p_sql || ', MAX( CASE marketplace_code WHEN '''
                   || t_codes(i)
                   || ''' THEN "count" END ) AS "'
                   || t_codes(i)
                   || '"';
  END LOOP;
  p_sql := p_sql || ' FROM your_table GROUP BY run_date';

  OPEN :cur FOR p_sql;
END;
/

PRINT cur;

【讨论】:

以上是关于在 Oracle SQL 中生成动态列值的主要内容,如果未能解决你的问题,请参考以下文章

在 SELECT 查询 SQL 中生成动态日期列

SQL :具有动态列值分配的更新语句

动态修剪列值

SQL:在 Chartio 中动态地将列转换为行

如何在 Oracle SQL Developer 中生成带有子查询的 INSERT 语句?

在 ASP.NET MVC 中向控制器传递多个参数;此外,在 LINQ-to-SQL 中生成动态查询