Google BigQuery 中的多级数据透视
Posted
技术标签:
【中文标题】Google BigQuery 中的多级数据透视【英文标题】:Multi-level pivot in Google BigQuery 【发布时间】:2017-02-17 00:00:56 【问题描述】:是否可以使用 BigQuery 在一个查询中执行以下数据透视,还是需要将其分解为多个查询?
这是原始数据:
这是数据透视表:
有没有办法在 BigQuery 中构建任意嵌套的数据透视表?还是每个级别都需要自己的 SQL 查询?
注意,在上面,为 6 列组合(CA-M、CA-F、FR-M、FR-F、US-M、US- F),但为了一般情况,假设可能有数百个国家/地区,因此在每个组合中手动编写不同的 CASE
语句是不切实际的。
【问题讨论】:
【参考方案1】:以下是我心目中的最佳选择
第 1 步 - 根据您的数据准备查询
#standardSQL
WITH country_sex_list AS (
SELECT Country, Sex
FROM yourTable
GROUP BY Country, Sex
),
permutations AS (
SELECT
STRING_AGG(CONCAT("SUM(CASE WHEN (Country, Sex) = ('", Country, "', '", Sex, "') THEN Income END) AS ", Country, "_", Sex), ',' ORDER BY Country, Sex) AS text
FROM country_sex_list
)
SELECT
CONCAT(
"SELECT company, ", text, ", SUM(Income) AS Total FROM yourTable GROUP BY Company UNION ALL ",
"SELECT 'Total' as company, ", text, ", SUM(Income) AS Total FROM yourTable"
) AS query
FROM permutations
第 2 步 - 获取第 1 步结果的文本并将其作为查询运行。 结果将如您所愿(请参见下面的示例)
company CA_M FR_F FR_M US_F US_M Total
Acme null 40,000 null null 40,000 80,000
Bravo 50,000 null null 30,000 null 80,000
Delta null null 40,000 null null 40,000
Total 50,000 40,000 40,000 30,000 40,000 200,000
我认为这两个步骤足够通用,可以扩展到实际用例
当然,您可以在 Web UI 中手动运行这两个步骤,也可以在您选择的 client 中编写脚本
下面是要测试的虚拟数据
WITH yourTable AS (
SELECT 'M' AS Sex, 'US' AS Country, 40000 AS Income, 'Acme' AS Company UNION ALL
SELECT 'M', 'CA', 50000, 'Bravo' UNION ALL
SELECT 'F', 'US', 30000, 'Bravo' UNION ALL
SELECT 'F', 'FR', 40000, 'Acme' UNION ALL
SELECT 'M', 'FR', 40000, 'Delta'
)
【讨论】:
非常感谢您的全面回答。 最后,我知道我们没有要测试的真实数据,但是您认为上述方法是构建数据透视表时使用的最高效的方法吗?例如,在一个查询中完成所有操作,而不是每个数据透视级别的多个查询? @David542 - 很难确定,但我认为一次拍摄会更有效、成本和性能更佳。同时,想提一下这种类型的旋转不是在 bigquery 中进行的最佳选择,并且更适合在可视化层中进行,但我仍然知道在某些情况下您可能需要在这里完成。如果您还没有尝试过 - 试试 BigQuery Mate - chrome.google.com/webstore/detail/bigquery-mate/… - 它在 Web UI 中嵌入了交互式可视化 - 正是在这种情况下,当您需要快速透视或任何其他图表时 谢谢,这是一个非常有用且很棒的 Chrome 工具!我在这里问了一个关于 BigQuery 的更笼统的问题,请看一下! -- ***.com/questions/42307033/…以上是关于Google BigQuery 中的多级数据透视的主要内容,如果未能解决你的问题,请参考以下文章
Google BigQuery SQL:将多级 JSON (list +json+list+json) 解析为列
将行转置为 BigQuery 中的列(数据透视实现)[重复]