Ниже приведен пример для BigQuery StandardSQL
#standardSQL
WITH `project.dataset.table` AS (
SELECT 1 id, 1 a, 2 b, 3 c UNION ALL
SELECT 1, 4, 5, 6 UNION ALL
SELECT 2, 7, 8, 9
)
SELECT id,
SUM((
SELECT SUM(CAST(SPLIT(pair, ':')[SAFE_OFFSET(1)] AS INT64))
FROM UNNEST(SPLIT(REGEXP_REPLACE(TO_JSON_STRING(t), r'[{}]', ''))) pair
WHERE SPLIT(pair, ':')[SAFE_OFFSET(0)] != '"id"'
)) val
FROM `project.dataset.table` t
GROUP BY id
с результатом как
Row id val
1 1 21
2 2 24
Как вы можете видеть - выше не зависит от количества столбцов
Также предполагается, чтовсе столбцы, кроме id
, должны быть суммированы.если у вас есть больше столбцов, которые нужно исключить - вы можете настроить WHERE
предложение соответственно
Обновление на основе предоставленных данных
Таким образом, вы хотите суммировать каждый столбец (изначально я читал ваш вопроскак если бы вы хотели сложить все значения столбца вместе по id)
#standardSQL
WITH `project.dataset.table` AS (
SELECT 1 id, 1 a, 2 b, 3 c UNION ALL
SELECT 1, 4, 5, 6 UNION ALL
SELECT 2, 7, 8, 9
)
SELECT id,
REPLACE(SPLIT(pair, ':')[SAFE_OFFSET(0)], '"', '') col,
SUM(CAST(SPLIT(pair, ':')[SAFE_OFFSET(1)] AS INT64)) val
FROM (
SELECT id,
ARRAY(
SELECT pair
FROM UNNEST(SPLIT(REGEXP_REPLACE(TO_JSON_STRING(t1), r'[{}]', ''))) pair
WHERE SPLIT(pair, ':')[SAFE_OFFSET(0)] != '"id"'
) arr
FROM `project.dataset.table` t1
) t2,
UNNEST(arr) pair
GROUP BY id, col
ORDER BY id, col
это даст вам результат ниже
Row id col val
1 1 a 5
2 1 b 7
3 1 c 9
4 2 a 7
5 2 b 8
6 2 c 9
этот результат представляет собой упрощенную версию того, что вам нужнои в большинстве практических случаев гораздо эффективнее, чем поворотный
Тем не менее, если вы хотите изменить этот результат - см. https://stackoverflow.com/a/35808045/5221944