将 google 工作表中的水平数据转换为垂直数据

Transform horizontal to vertical data in google sheets

我们在 google sheet 中有数千行需要转换并加载到数据库中。数据的布局不适合我们的数据库架构,因此在将数据加载到数据库之前需要对其进行转换。

如何以编程方式将水平数据转换为垂直数据?

样品 sheet 可用 here

源数据(水平布局):

Company name    2017-01-14  2017-02-14  2017-03-14
Company 1       1522        1141        1505
Company 2       1866        1909        1610
Company 3       1726        1237        1057
Company 4       1427        1375        1446
Company 5       1590        1819        1352

所需结果(垂直布局):

2017-01-14  Company 1   1522
2017-01-14  Company 2   1866
2017-01-14  Company 3   1726
2017-01-14  Company 4   1427
2017-01-14  Company 5   1590
2017-02-14  Company 1   1141
2017-02-14  Company 2   1909
2017-02-14  Company 3   1237
2017-02-14  Company 4   1375
2017-02-14  Company 5   1819
2017-03-14  Company 1   1505
2017-03-14  Company 2   1610
2017-03-14  Company 3   1057
2017-03-14  Company 4   1446
2017-03-14  Company 5   1352

查询使用 header 参数为所有包含数据的行创建一行(每个 cell/header 一行)。然后使用 JOIN 将所有内容吸入一个单元格。然后使用 SPLIT 将所有数据放入其自己的单元格中。 TRANSPOSE 函数根据该数据为每个范围创建一个垂直列。

thousands of rows ... need to be transformed and loaded into a database

根据这个问题的标签,我假设数据库是 BigQuery

我可以建议将数据按原样加载到 BigQuery 或创建外部 table - 之后您可以使用下面的查询进行所需的转换

#standardSQL
SELECT 
  ['2017-01-14', '2017-02-14', '2017-03-14'][OFFSET(pos)] day, 
  company_name, 
  value
FROM `project.dataset.table`, 
UNNEST([date_20170114, date_20170214, date_20170314]) value WITH OFFSET pos
-- ORDER BY day, company_name  

您可以使用问题中的虚拟数据来测试/使用它,如下所示

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'Company 1' company_name, 1522 date_20170114, 1141 date_20170214, 1505 date_20170314 UNION ALL
  SELECT 'Company 2', 1866, 1909, 1610 UNION ALL
  SELECT 'Company 3', 1726, 1237, 1057 UNION ALL
  SELECT 'Company 4', 1427, 1375, 1446 UNION ALL
  SELECT 'Company 5', 1590, 1819, 1352 
)
SELECT 
  ['2017-01-14', '2017-02-14', '2017-03-14'][OFFSET(pos)] day, 
  company_name, 
  value
FROM `project.dataset.table`, 
UNNEST([date_20170114, date_20170214, date_20170314]) value WITH OFFSET pos
ORDER BY day, company_name