简体   繁体   中英

BigQuery - PIVOT with declared ARRAY

Pivoting like this works

BEGIN
    CREATE TEMP TABLE SOF_SAMPLE
    AS  SELECT 1 id, 'BANANA' fruit, 2 value
    UNION ALL SELECT 2, 'ORANGE', 10
    UNION ALL SELECT 3, 'APPLE', 3;
END;
SELECT * FROM (
  SELECT ID, VALUE, FRUIT
  FROM `SOF_SAMPLE`
  WHERE 
    1=1
    AND FRUIT IN ('BANANA', 'APPLE')
)
PIVOT (
  AVG(VALUE)
  FOR FRUIT IN ('BANANA', 'APPLE')
)

However it seems that PIVOT .. FOR i IN does not accept UNNEST ( Syntax error: Unexpected ")" at )

DECLARE FRUITS ARRAY <STRING> DEFAULT ['BANANA', 'APPLE'];

SELECT * FROM (
  SELECT ID, VALUE, FRUIT
  FROM `SOF_SAMPLE`
  WHERE 
    1=1
    AND FRUIT IN UNNEST(FRUITS)
)
PIVOT (
  AVG(VALUE)
  FOR FRUIT IN UNNEST(FRUITS)
)

It's not allowed to use an array as pivot columns, so most general way to to is to write a dynamic sql. Consider below query.

EXECUTE IMMEDIATE FORMAT("""
SELECT * FROM (
  SELECT ID, VALUE, FRUIT FROM `SOF_SAMPLE` WHERE FRUIT IN ('%s')
)
PIVOT (AVG(VALUE) FOR FRUIT IN ('%s'))
"""
, ARRAY_TO_STRING(FRUITS, "','")
, (SELECT STRING_AGG(FRUITS, "','") FROM SOF_SAMPLE));

在此处输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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