使用存储过程透视表

Posted

技术标签:

【中文标题】使用存储过程透视表【英文标题】:Pivot a table using a stored procedure 【发布时间】:2019-12-05 21:36:06 【问题描述】:

所以我正在尝试使用 Redshift 中的存储过程来透视表。问题是结果集是动态的。这意味着我们需要能够动态地旋转下表。这就是我想要改变的:

| object_uid | field    |  value   |
|------------|----------|----------|
| post:1     | field_1_a| test     |
| post:2     | field_2_a| turtle   |
| post:2     | field_2_b| frog     |
| post:3     | field_3_a| mountain |
| ......     |   .....  | ......   |
|------------|----------|----------|

这将转化为以下内容:

| object_uid | field_1_a| field_2_a| field_2_b| field_3_a|
|------------|----------|----------|----------|----------|
| post:1     | test     |          |          |          |
| post:2     |          | turtle   | frog     |          |
| post:3     |          |          |          | mountain |
| .......    |  .....   | .......  | .......  | .......  |
|------------|----------|----------|----------|----------|

本质上,我试图通过子查询中的SELECT LISTAGG 语句构造一个链接的列名字符串(field_* 列),并尝试在CREATE TABLE sql 语句中插入该语句的输出。然后,一旦构造了CREATE TABLE sql 语句,就会通过EXECUTE 命令执行该sql 语句。

但是,这与预期的不同。我是 Redshift 的新手,所以如果这是一种将桌子从高桌旋转到宽桌的糟糕方法,我提前道歉。这是我到目前为止的代码:

CREATE OR REPLACE PROCEDURE my_proc (
    tmp_name INOUT varchar(256)
) AS $$
DECLARE
    sql VARCHAR(MAX) := '';
BEGIN
    WITH pivot_output AS (
        SELECT LISTAGG(temp.output, ', ') WITHIN GROUP (ORDER BY temp.output) AS metadata FROM
        (
            SELECT DISTINCT
                'MAX(IF(cm.metadata = ''' || metadata || ''',cm.field_value,NULL)) AS ' || QUOTE_LITERAL(metadata)
            AS output
            FROM "content_metadata" cm
            WHERE cm."source_uid_type" = 'post'
        ) AS temp
    );

    sql = 'CREATE TABLE ' || tmp_name || ' AS SELECT cm.object_uid, ' || pivot_output.metadata || ' FROM content_metadata cm GROUP BY cm.object_uid';
    EXECUTE sql;
END;
$$ LANGUAGE plpgsql;

CALL my_proc ('output_table');

尝试执行上述操作时出现以下错误:

数据库报告语法错误:Amazon Invalid operation: syntax error at or near "$1";

有点被这个错误难住了。有没有人有任何线索/建议?

【问题讨论】:

【参考方案1】:

我在我们的 GitHub 存储库“Amazon Redshift Utils”中添加了一个模拟 PIVOT FOR 语法的工作示例。 https://github.com/awslabs/amazon-redshift-utils/blob/master/src/StoredProcedures/sp_pivot_for.sql

我希望这对你有用。如果您有任何问题,请告诉我。

【讨论】:

以上是关于使用存储过程透视表的主要内容,如果未能解决你的问题,请参考以下文章

使用存储过程的结果加入表

如何在递归存储过程中使用数据透视

动态透视查询查看/存储过程?

SQLServer(子查询,存储过程,透视,索引)

动态透视表

将数据透视结果附加(插入)到现有 SQL 表中