SQL:在 Chartio 中动态地将列转换为行

Posted

技术标签:

【中文标题】SQL:在 Chartio 中动态地将列转换为行【英文标题】:SQL: Dynamically Transposing Column as Row in Chartio 【发布时间】:2016-06-20 09:08:20 【问题描述】:

希望您能帮我将此表格的列转换成一行。我试图让项目名称(第 1 列)每个都成为自己的列标题,并将 MUV 值作为列值输入。

我已经阅读了关于这个主题的 20 多个线程,但它们使用不同的 SQL 包和我无法使用的代码。

理想的解决方案是修改此查询以创建所需的查询输出:

当前查询:

SELECT
    cust_gae_account.project_name as "Project Name",
    cust_be_project_usage.unique_visitor_count as "MUVs",
    cust_be_project_usage.billing_period_start as "Month"
FROM
    cust_be_project_usage
INNER JOIN
    cust_gae_account 
    ON cust_gae_account.account_id = cust_be_project_usage.project_id
WHERE
    cust_be_project_usage.admin_account_id = ACCOUNT_ID

当前查询输出:

Project Name     |      MUVs       |     Month
-----------------------------------------------------
ProjectAAAAAZ    |      68000      |   Jun 01, 2016
DynamicName      |       3200      |   Jun 01, 2016
ProjectAAAAAZ    |      21000      |   May 01, 2016
DynamicName      |       4500      |   May 01, 2016
CustomProject    |     117000      |   Jun 01, 2016
CustomProject    |     118400      |   May 01, 2016

所需的查询输出:

Project Name     |  CustomProject  |  ProjectAAAAAZ  |  DynamicName  
-------------------------------------------------------------------
Jun 01, 2016     |     117000      |      68000      |      3200
May 01, 2016     |     118400      |      21000      |      4500

注意事项:

我们通过 Chartio 使用 PostgreSQL,我们只能使用基本 SQL 遗憾的是我们不能使用自定义函数 项目的名称和数量是动态的,从 1 到 20 不等 MUV 始终是数字,没有重复项

【问题讨论】:

您使用的是哪个 DBMS? 我们使用的是 PostgreSQL。我们不能使用自定义函数,只能查询 你基本上想要一个数据透视表。您可以使用 crosstab postgresql.org/docs/9.1/static/tablefunc.html 来完成它,但它会输出一个静态宽度的表格,其中包含预定义的列和类型。您需要在数据库之外执行此操作。或者,创建一个动态查询,并使用 EXECUTE 执行它 【参考方案1】:

您可以使用交叉表 https://www.postgresql.org/docs/9.1/static/tablefunc.html ,但它仅适用于静态列列表。所以你需要一个动态查询。您需要定义该查询并执行它。

EXECUTE ('SELECT * FROM crosstab(
    \'SELECT
        cust_be_project_usage.billing_period_start as "Month",
        cust_gae_account.project_name as "Project Name",
        cust_be_project_usage.unique_visitor_count as "MUVs"
    FROM
        cust_be_project_usage
    INNER JOIN
        cust_gae_account 
        ON cust_gae_account.account_id = cust_be_project_usage.project_id
    WHERE
        cust_be_project_usage.admin_account_id = ACCOUNT_ID\',
    \'SELECT
        cust_gae_account.project_name as "Project Name"
    FROM
        cust_be_project_usage
    INNER JOIN
        cust_gae_account 
        ON cust_gae_account.account_id = cust_be_project_usage.project_id
    WHERE
        cust_be_project_usage.admin_account_id = ACCOUNT_ID\')
AS ( "Project Name" date, ' || 
    (SELECT
        string_agg(cust_gae_account.project_name, ' int,')
    FROM
        cust_be_project_usage
    INNER JOIN
        cust_gae_account 
        ON cust_gae_account.account_id = cust_be_project_usage.project_id
    WHERE
        cust_be_project_usage.admin_account_id = ACCOUNT_ID) || ' int'
|| ' )')

虽然我无法测试它。它应该有效,但我怀疑在这些情况下它可能不会:

    连接到由查询形成的标量(可能需要为此使用变量) 我可能在某处混淆了列 不确定如何传递 ACCOUNT_ID 参数,因此您可能也需要更改它

【讨论】:

嗨,Alexander,非常感谢您抽出宝贵时间回答这个问题。当我运行查询时,在第一个左括号(在执行之后)出现语法错误 然后尝试不使用括号。今天晚些时候我将尝试在实际的数据库上运行它。 非常感谢您的帮助。我尝试删除括号并重新格式化查询。我一直遇到错误。你的任何帮助都将是巨大的!

以上是关于SQL:在 Chartio 中动态地将列转换为行的主要内容,如果未能解决你的问题,请参考以下文章

将列转置为行 SQL Server

SQL Server:将列转换为行

Postgres 表选择多列并将结果(列)动态转换为行 - 将列转置为行

sql 将列数据转换为行

SQL 将列转换为行

SQL 查询将列转换为行