【问题标题】:how to preserve column names on dynamic pivot如何在动态枢轴上保留列名
【发布时间】:2016-05-17 09:13:08
【问题描述】:

销售数据包含可以包含任何字符的动态产品名称。

动态数据透视表是根据来自的样本创建的 Crosstab with a large or undefined number of categories

translate() 用于删除坏字符。

结果数据透视表列名已损坏:删除了缺失的字符和空格。 如何返回与源数据具有相同列名的数据? 我尝试使用

  quote_ident(productname) as tootjakood, 

而不是

  'C'||upper(Translate(productname,'Ø. &/+-,%','O')) as tootjakood, 

但它返回错误

错误:“Ø,12.3/3mm”列不存在

测试用例:

create temp table sales ( saledate date, productname char(20), quantity int );
insert into sales values ( '2016-1-1', 'Ø 12.3/3mm', 2);
insert into sales values ( '2016-1-1', '+-3,4%/3mm', 52);
insert into sales values ( '2016-1-3', '/3,2m-', 246);

do $do$


declare
voter_list text;
begin

create temp table myyk on commit drop as
select saledate as kuupaev,
  'C'||upper(Translate(productname,'Ø. &/+-,%','O')) as tootjakood, 
  sum(quantity)::int as kogus 
from sales
group by 1,2
;

drop table if exists pivot;

voter_list := (
    select string_agg(distinct tootjakood, ' ' order by tootjakood) from myyk
    );

execute(format('
    create table pivot (
kuupaev date,
        %1$s
    )', (replace(voter_list, ' ', ' integer, ') || ' integer')
));

execute (format($f$

  insert into pivot
        select
           kuupaev,
            %2$s
        from crosstab($ct$
            select
                kuupaev,tootjakood,kogus
            from myyk
            order by 1
            $ct$,$ct$
            select distinct tootjakood
            from myyk
            order by 1
            $ct$
        ) as (
            kuupaev date,
            %4$s
        );$f$,

        replace(voter_list, ' ', ' + '),
        replace(voter_list, ' ', ', '),
        '',
        replace(voter_list, ' ', ' integer, ') || ' integer'  -- 4.
    ));
end; $do$;

select * from pivot;

使用 Postgres 9.1。

【问题讨论】:

    标签: sql postgresql pivot plpgsql postgresql-9.1


    【解决方案1】:

    你应该使用双引号。因为是用空格来标识列分隔符,所以应该去掉列名中的空格(或者改变分隔符的标识方式)。

    ...
    select saledate as kuupaev,
      format ('"%s"', replace (upper(productname), ' ', '')) as tootjakood, 
      sum(quantity)::int as kogus 
    from sales
    ...
    

    你会得到:

      kuupaev   | /3,2M- | +-3,4%/3MM | O12.3/3MM 
    ------------+--------+------------+-----------
     2016-01-01 |        |         52 |         2
     2016-01-03 |    246 |            |          
    (2 rows)
    

    【讨论】:

    猜你喜欢
    • 2011-06-26
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    相关资源
    最近更新 更多