简体   繁体   English

如何在谷歌 BigQuery 中将行转换为列?

[英]how to convert rows into columns in google BigQuery?

Following is the input:以下是输入: 在此处输入图片说明

Expected output:预期输出: 在此处输入图片说明

Assuming you have limited number of rows(months) and columns - you can use below假设您的行数(月)和列数有限 - 您可以在下面使用

#standardSQL
SELECT col AS month,
  MAX(IF(month = 'Jan-20', val, NULL)) AS Jan_20,
  MAX(IF(month = 'Dec-19', val, NULL)) AS Dec_19,
  MAX(IF(month = 'Nov-19', val, NULL)) AS Nov_19,
  MAX(IF(month = 'Oct-19', val, NULL)) AS Oct_19,
  MAX(IF(month = 'Sep-19', val, NULL)) AS Sep_19
FROM `project.dataset.table`,
UNNEST(['AmountSales', 'AmountDebit', 'DebitCreditPercent']) col,
UNNEST([CASE col 
  WHEN 'AmountSales' THEN AmountSales 
  WHEN 'AmountDebit' THEN AmountDebit 
  WHEN 'DebitCreditPercent' THEN DebitCreditPercent 
  END]) val
GROUP BY col

You can test / play with above using sample/dummy data as in below example您可以使用以下示例中的示例/虚拟数据来测试/播放上面的内容

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'Jan-20' month, 1 AmountSales, 2 AmountDebit, 3 DebitCreditPercent UNION ALL
  SELECT 'Dec-19', 4, 5, 6 UNION ALL
  SELECT 'Nov-19', 7, 8, 9 UNION ALL
  SELECT 'Oct-19', 10, 11, 12 UNION ALL
  SELECT 'Sep-19', 13, 14, 15 
)
SELECT col AS month,
  MAX(IF(month = 'Jan-20', val, NULL)) AS Jan_20,
  MAX(IF(month = 'Dec-19', val, NULL)) AS Dec_19,
  MAX(IF(month = 'Nov-19', val, NULL)) AS Nov_19,
  MAX(IF(month = 'Oct-19', val, NULL)) AS Oct_19,
  MAX(IF(month = 'Sep-19', val, NULL)) AS Sep_19
FROM `project.dataset.table`,
UNNEST(['AmountSales', 'AmountDebit', 'DebitCreditPercent']) col,
UNNEST([CASE col 
  WHEN 'AmountSales' THEN AmountSales 
  WHEN 'AmountDebit' THEN AmountDebit 
  WHEN 'DebitCreditPercent' THEN DebitCreditPercent 
  END]) val
GROUP BY col

with output带输出

Row month               Jan_20  Dec_19  Nov_19  Oct_19  Sep_19   
1   AmountSales         1       4       7       10      13   
2   AmountDebit         2       5       8       11      14   
3   DebitCreditPercent  3       6       9       12      15   

Since I want a fixed number of dynamic columns names generated at run time month-wise, I have added logic to check month value to dynamically generated column names as follow:由于我想要在运行时按月生成固定数量的动态列名称,因此我添加了检查月份值的逻辑以动态生成的列名称,如下所示:

standardSQL标准SQL

WITH project.dataset.table AS ( SELECT 'Jan-20' month, 1 AmountSales, 2 AmountDebit, 3 DebitCreditPercent UNION ALL SELECT 'Dec-19', 4, 5, 6 UNION ALL SELECT 'Nov-19', 7, 8, 9 UNION ALL SELECT 'Oct-19', 10, 11, 12 UNION ALL SELECT 'Sep-19', 13, 14, 15 ) SELECT col AS month, MAX(IF(month = Concat(FORMAT_DATE("%b", DATE_ADD(DATE_TRUNC(CURRENT_DATE(), MONTH), INTERVAL -2 MONTH)),'-', substr(cast(EXTRACT(YEAR FROM DATE_ADD(DATE_TRUNC(CURRENT_DATE(), MONTH), INTERVAL -2 MONTH)) as string),3,2)), val, NULL)) AS Jan_19 WITH project.dataset.table AS ( SELECT 'Jan-20' 月, 1 AmountSales, 2 AmountDebit, 3 DebitCreditPercent UNION ALL SELECT 'Dec-19', 4, 5, 6 UNION ALL SELECT 'Nov-19', 7, 8 , 9 UNION ALL SELECT 'Oct-19', 10, 11, 12 UNION ALL SELECT 'Sep-19', 13, 14, 15 ) SELECT col AS month, MAX(IF(month = Concat(FORMAT_DATE("%b") , DATE_ADD(DATE_TRUNC(CURRENT_DATE(), MONTH), INTERVAL -2 MONTH)),'-', substr(cast(EXTRACT(YEAR FROM DATE_ADD(DATE_TRUNC(CURRENT_DATE(), MONTH), INTERVAL -2 MONTH)) 作为字符串),3,2)), val, NULL)) AS Jan_19

FROM project.dataset.table , UNNEST(['AmountSales', 'AmountDebit', 'DebitCreditPercent']) col, UNNEST([CASE col WHEN 'AmountSales' THEN AmountSales WHEN 'AmountDebit' THEN AmountDebit WHEN 'DebitCreditPercent' THEN DebitCreditPercent END]) val GROUP BY col FROM project.dataset.table , UNNEST(['AmountSales', 'AmountDebit', 'DebitCreditPercent']) col, UNNEST([CASE col WHEN 'AmountSales' THEN AmountSales WHEN 'AmountDebit' THEN AmountDebit WHEN 'DebitCreditPercent' THEN DebitCreditPercent' THEN DebitCreditPercent] ) val GROUP BY col

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM