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 中的多级数据透视的主要内容,如果未能解决你的问题,请参考以下文章

在 BigQuery 中的大表中取消透视日期列

如何删除熊猫数据透视表中的多级索引

Google BigQuery SQL:将多级 JSON (list +json+list+json) 解析为列

将行转置为 BigQuery 中的列(数据透视实现)[重复]

在 BigQuery 或 Google Data Studio 中获取上个月的数据

BigQuery 中的列数限制?