在 Redshift 中将列名作为参数传递给 "PREPARE" 的问题

Issue with passing column name as a parameter to "PREPARE" in Redshift

我正在使用 REDSHIFT 解决以下问题,这是问题所在,我正在寻找解决方案。

我有 2 个 table,一个 table 包含列组合,第二个 table 应该根据这些组合对结果进行分组。

Table 1 个包含列组合(这是存储过程的输出):

COMBINATIONS

fruit_combinations 
  banana,'ALL'  
  banana, orange

Table 2个包含fruit_baskets:

FRUIT_BASKET

BANANA ORANGE USER_COUNT 
  b1     o1      5
  b1     o2      10

结果集:

FRUIT_BASKET_AGG

BANANA   ORANGE    USER_COUNT 
  b1     'ALL'       15
  b1      o1         5
  b1      o2         10

在 Redshift 中尝试过的解决方案:

PREPARE executesql(VARCHAR(10),VARCHAR(10))
AS 
select ,, sum(fb.user_Count) as user_count
from dv_product.fruit_basket fb
group by 1,2;

EXECUTE executesql("BANANA","ORANGE") ;
DEALLOCATE executesql;

Error: [Amazon](500310) Invalid operation: column "banana" does not exist;

问题:

1 - 有没有办法将列名作为参数传递给 sql 语句并执行 sql?

2 - 在 Redshift 中实现上述结果集的其他替代方法是什么?

这可以现在 使用存储过程完成,而不需要 PREPARE"Overview of Stored Procedures in Amazon Redshift"

您似乎在尝试模拟 GROUPING SETSROLLUP 功能。我在动态 SQL 中添加了一个 UNION ALL 来提供这种类型的输出。

对于此示例存储过程,两个列名都作为输入提供,REFCURSOR 声明为输出。

CREATE PROCEDURE get_fruit_sum(IN column_1 VARCHAR, IN column_2 VARCHAR, result_set INOUT REFCURSOR) AS $$
BEGIN
OPEN result_set FOR
EXECUTE 'SELECT '|| quote_ident(column_1) ||' , '|| quote_ident(column_2) 
        || ' , SUM(fb.user_Count) as user_count ' 
        || 'FROM dv_product.fruit_basket fb GROUP BY 1,2'
        || 'UNION ALL '
        || 'SELECT '|| quote_ident(column_1) ||' , ''ALL'''
        || ' , SUM(fb.user_Count) as user_count ' 
        || 'FROM dv_product.fruit_basket fb GROUP BY 1;'  
RETURN;
END;
$$ LANGUAGE plpgsql;

调用过程时指定列和输出 REFCURSOR。如果需要,可以通过另一个存储过程从 table 中检索列名。然后从 REFCURSOR 获取输出。

BEGIN; 
CALL get_fruit_sum ( 'Banana','Orange','result_set' ); 
FETCH ALL FROM result_set; 
END;