2016-02-07 31 views
0

销售数据包含可以包含任何字符的动态产品名称。基于样本创建从 Crosstab with a large or undefined number of categories如何保留动态数据透视表上的列名

动态透视表翻译()被用于去除坏字符。

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

quote_ident(productname) as tootjakood, 

代替

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

错误,将返回错误:列 “Ø,12.3 /3毫米” 不存在

测试用例:

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。

回答

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) 
+0

非常感谢你。有相关的问题在http://stackoverflow.com/questions/35266931/returning-empty-data-from-dynamic-pivot-is-there-is-no-data – Andrus