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

时间:2016-06-20 09:08:21

标签: sql postgresql pivot

我很乐意帮助您将此表格的专栏翻译成一行。我试图让项目名称(第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始终是数字,没有重复

1 个答案:

答案 0 :(得分:0)

您可以使用交叉表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'
|| ' )')

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

  1. 连接到由查询形成的标量(可能需要使用该变量)
  2. 我可能在某处混淆了一个专栏
  3. 不确定如何传递{ACCOUNT_ID}参数,因此您可能需要更改