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 中动态地将列转换为行的主要内容,如果未能解决你的问题,请参考以下文章