在Google工作表中将水平数据转换为垂直数据

时间:2017-11-01 20:18:28

标签: sql google-sheets google-bigquery etl

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

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

样本表可用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

2 个答案:

答案 0 :(得分:1)

  

数千行......需要转换并加载到数据库中

基于此问题的标记,我假设数据库是BigQuery

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

  
#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  

您可以使用问题中的dumy数据进行测试/播放,如下所示

#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

答案 1 :(得分:0)

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