Google BigQuery中的多级数据透视

时间:2017-02-17 00:00:57

标签: sql google-bigquery

是否可以使用BigQuery在一个查询中执行以下数据透视,或者我是否需要将其分解为多个查询?

以下是原始数据:

enter image description here

这是数据透视表:

enter image description here

有没有办法在BigQuery中构建一个任意嵌套的数据透视表?或者每个级别是否需要自己的SQL查询?

注意,在上文中,为6个列组合中的每一个(CA-M,CA-F,FR-M,FR-F,US-M,...做CASE WHEN语句很简单。 US-F),但是为了一般情况,我们假设可能有数百个国家,因此将每个组合手动编写为不同的CASE语句是不切实际的。

1 个答案:

答案 0 :(得分:4)

以下是我心目中最优化的选项

  

第1步 - 根据您的数据准备查询

<a>

步骤2 - 获取步骤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  

我认为这两个步骤足够通用,可以扩展到实际用例

当然,您可以在Web UI中手动运行这两个步骤,也可以在您选择的client中编写脚本

下面是要用

进行测试的虚拟数据
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