Sql 行值到列,列名称到值bigquery

Sql 行值到列,列名称到值bigquery,sql,regex,google-bigquery,pivot,Sql,Regex,Google Bigquery,Pivot,我正在尝试创建一个包含两列“tags”和“cnt”的新表 “标记”将包含列名称作为值 “cnt”包含每个原点列的值 您可以使用数组取消IVOT: select el.which, el.cnt from t cross join (unnest([struct('ALL_CLOSE' as which, t.all_close as cnt), struct('ALL_OPEN' as which, t.all_open as cnt),

我正在尝试创建一个包含两列“tags”和“cnt”的新表

“标记”将包含列名称作为值

“cnt”包含每个原点列的值


您可以使用数组取消IVOT:

select el.which, el.cnt
from t cross join
     (unnest([struct('ALL_CLOSE' as which, t.all_close as cnt),
              struct('ALL_OPEN' as which, t.all_open as cnt),
              . . .
             ])) u(el)

下面是BigQuery标准SQL

#standardSQL
SELECT 
  TRIM(SPLIT(kv, ':')[OFFSET(0)], '"') tag,
  SPLIT(kv, ':')[SAFE_OFFSET(1)] cnt
FROM `project.dataset.table` t,
UNNEST(REGEXP_EXTRACT_ALL(TRIM(TO_JSON_STRING(t), '{}'), r'(.*?)(?:,|$)')) kv  
您可以使用问题中的样本数据测试、播放上述内容,如下例所示

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 8279 all_close, 4 all_open, 1504 only_o, 16785 only_f 
)
SELECT 
  TRIM(SPLIT(kv, ':')[OFFSET(0)], '"') tag,
  SPLIT(kv, ':')[SAFE_OFFSET(1)] cnt
FROM `project.dataset.table` t,
UNNEST(REGEXP_EXTRACT_ALL(TRIM(TO_JSON_STRING(t), '{}'), r'(.*?)(?:,|$)')) kv  
结果

Row tag         cnt  
1   all_close   8279     
2   all_open    4    
3   only_o      1504     
4   only_f      16785