Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Oracle SQL中生成动态列值_Sql_Oracle_Pivot_Transpose - Fatal编程技术网

在Oracle SQL中生成动态列值

在Oracle SQL中生成动态列值,sql,oracle,pivot,transpose,Sql,Oracle,Pivot,Transpose,我想从数据中的一列动态创建列。在下面的例子中,我需要按运行日期对数据进行分组,并将每个marketplace代码作为列名 所以基本上我需要转换这些数据: run_date, marketplace_code, count 06-APR-16, US, 1125197 06-APR-16, MX, 26873 06-APR-16, IT, 5197 06-A

我想从数据中的一列动态创建列。在下面的例子中,我需要按运行日期对数据进行分组,并将每个marketplace代码作为列名

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

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,但我不确定如何解决这个问题。此外,我们需要考虑的是,市场定位代码的数量不是固定的,可能会增加。提前感谢。

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;
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;
动态数据透视值的PL/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;
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动态透视”