在 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 中生成动态列值的主要内容,如果未能解决你的问题,请参考以下文章