Ниже для BigQuery Standard SQL
#standardSQL
SELECT
person,
REGEXP_EXTRACT(SPLIT(kv, ':')[OFFSET(0)], r'"(.+)_') AS color,
REGEXP_EXTRACT(SPLIT(kv, ':')[OFFSET(0)], r'_(.+)"') AS fruit,
SUM(CAST(SPLIT(kv, ':')[OFFSET(1)] AS INT64)) AS value
FROM `project.dataset.table` t,
UNNEST(REGEXP_EXTRACT_ALL(TO_JSON_STRING(t), r',(".+?":.+?)')) kv
GROUP BY person, color, fruit
, если применить к образцу данных в вашем вопросе - результат
Вы можете выполнить тестирование с помощью CTE, созданной на основе данных образца, как показано в примере ниже
#standardSQL
WITH `project.dataset.table` AS (
SELECT 'bill' person, 4 red_apple, 1 green_apple, 1 red_pear, 4 green_pear UNION ALL
SELECT 'bill', 0, 1, 2, 0 UNION ALL
SELECT 'jill', 2, 1, 1, 4 UNION ALL
SELECT 'jill', 0, 0, 2, 0
)
SELECT
person,
REGEXP_EXTRACT(SPLIT(kv, ':')[OFFSET(0)], r'"(.+)_') AS color,
REGEXP_EXTRACT(SPLIT(kv, ':')[OFFSET(0)], r'_(.+)"') AS fruit,
SUM(CAST(SPLIT(kv, ':')[OFFSET(1)] AS INT64)) AS value
FROM `project.dataset.table` t,
UNNEST(REGEXP_EXTRACT_ALL(TO_JSON_STRING(t), r',(".+?":.+?)')) kv
GROUP BY person, color, fruit