Dynamic 如何在Snowflake中以动态值为轴心

Dynamic 如何在Snowflake中以动态值为轴心,dynamic,pivot,snowflake-cloud-data-platform,Dynamic,Pivot,Snowflake Cloud Data Platform,我想基于一个字段透视一个表,该字段可以包含事先并不总是知道的动态值 我可以通过硬编码不需要的值来实现: SELECT * FROM my_table pivot(SUM(amount) FOR type_id IN (1,2,3,4,5,20,50,83,141,...); 但我无法使用查询动态提供值: SELECT * FROM my_table pivot(SUM(amount) FOR type_id IN (SELECT id FROM types); --- 090150 (

我想基于一个字段透视一个表,该字段可以包含事先并不总是知道的动态值

我可以通过硬编码不需要的值来实现:

SELECT *
FROM my_table
  pivot(SUM(amount) FOR type_id IN (1,2,3,4,5,20,50,83,141,...);
但我无法使用查询动态提供值:

SELECT *
FROM my_table
  pivot(SUM(amount) FOR type_id IN (SELECT id FROM types);
---
090150 (22000): Single-row subquery returns more than one row. 

SELECT *
FROM my_table
  pivot(SUM(amount) FOR type_id IN (SELECT ARRAY_AGG(id) FROM types);
---
001038 (22023): SQL compilation error:                                          
Can not convert parameter 'my_table.type_id' of type [NUMBER(38,0)] into expected type [ARRAY]

有没有办法做到这一点?

我认为在原生SQL中不可能做到,但我编写并发布了一些代码,展示了我的团队如何通过从Python生成查询来做到这一点

您可以直接调用Python脚本,传递与Excel为透视表提供的选项类似的参数:

python generate_pivot_query.py                  \
    --dbtype snowflake --database mydb          \
    --host myhost.url --port 5432               \
    --user me --password myp4ssw0rd             \
    --base-columns customer_id                  \
    --pivot-columns category                    \
    --exclude-columns order_id                  \
    --aggfunction-mappings amount=sum           \
    myschema orders

或者,如果您正在使用,可以使用CreatePivotTable操作符直接创建任务。

我编写了一个Snowflake存储过程来获取Snowflake中的动力学数据透视,请选中:

3个步骤:

查询 调用存储过程调用pivot\u prev\u结果 查找结果从tableresult\u scanlast\u query\u id-2中选择* 程序如下:

创建或替换过程透视图\u上一个\u结果 返回字符串 语言javascript 以调用方身份执行 $$ var cols\u查询=` 选择“\\” ||listaggdistinct pivot\u列“\\”,\\按pivot\u列分组顺序内 || '\\ 从表result\u scanlast\u query\u id-1 `; var stmt1=snowflake.createStatement{sqlText:cols_query}; var results1=stmt1.execute; 结果1.其次; var col_list=results1.getColumnValue1; pivot\u查询=` 选择* 从选择*从表格结果\u扫描最后一次\u查询\u id-2 ${col_list}中pivot_列的pivotmaxpivot_值 ` var stmt2=snowflake.createStatement{sqlText:pivot\u query}; stmt2.execute; 返回'select*fromtableresult_scan'${stmt2.getQueryId}'\n从tableresult\u scanlast\u query\u id-2中选择*; $$;