首页 > 解决方案 > 使用选择查询的结果作为交叉表中的列定义列表

问题描述

我创建了一个函数n_months_crosstab(n),它接受一个整数作为参数,并返回一个字符串,表示我想要的交叉表列作为文本:

CREATE OR REPLACE FUNCTION public.n_months_crosstab(n integer)
RETURNS text
LANGUAGE sql
AS $function$ 

with 
dates as (
    select ('"' || to_char(generate_series((now() - interval '1 months'*n)::date, now(), '1 month'), 'Mon-YY') || '"') months)
select concat('"Fund" text,', string_agg(dates.months, ' text,')||' text'::text) from dates;

$function$

执行n=2给出:

"Fund" text,"May-20" text,"Jun-20" text,"Jul-20" text

如果我复制返回的值并将其用作交叉表查询列定义列表,我会得到我想要的结果。但是,我怎样才能使用函数调用来代替它的文本输出呢?

我想做类似的事情:

select crosstab.* 
from crosstab('source sql','category sql')
as (select n_months_crosstab(2))

代替:

select crosstab.* 
from crosstab('source sql','category sql') 
as ("Fund" text,"May-20" text,"Jun-20" text,"Jul-20" text)

这可能吗?

标签: sqlpostgresqlcrosstab

解决方案


推荐阅读