Как применить функцию агрегации SUM () ко многим столбцам одновременно? - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть общее табличное выражение с псевдонимом table, которое я создал с помощью Big Query Standard SQL. table имеет много столбцов, которые я хочу суммировать в одну строку с помощью агрегации GROUP BY.

Я пробовал этот запрос, который возвращает ошибку

* может использоваться только в COUNT (*)

SELECT "all" as problem_type, SUM(*)
FROM table
GROUP BY problem_type

Я пытаюсь избежать этого для n столбцов:

SELECT "all" as problem_type, SUM(Value_1), SUM(Value_2), .... SUM(Value_N) 
FROM table
GROUP BY problem_type

Может ли кто-нибудь помочь с эффективный запрос для решения этой задачи?

1 Ответ

1 голос
/ 16 апреля 2020

Ниже представлен единственный вариант, который я могу вам предложить (BigQuery Standard SQL)

#standardSQL
SELECT problem_type, key, SUM(CAST(value AS INT64)) AS sum_value
FROM `project.dataset.table` t,
UNNEST(SPLIT(REGEXP_REPLACE(TO_JSON_STRING(t), '[{}"]', ''))) kv,
UNNEST([STRUCT(SPLIT(kv, ':')[OFFSET(0)] AS key, SPLIT(kv, ':')[OFFSET(1)] AS value)])
WHERE NOT key = 'problem_type'
GROUP BY problem_type, key  

, который вы можете протестировать, поиграйте с ним выше, используя данные образца / фиктивного элемента, как в примере ниже

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 problem_type, 1 value_1, 2 value_2, 3 value_3 UNION ALL
  SELECT 1, 4, 5, 6 UNION ALL
  SELECT 1, 7, 8, 9 UNION ALL
  SELECT 2, 14, 15, 16 UNION ALL
  SELECT 2, 17, 18, 19 
)
SELECT problem_type, key, SUM(CAST(value AS INT64)) AS sum_value
FROM `project.dataset.table` t,
UNNEST(SPLIT(REGEXP_REPLACE(TO_JSON_STRING(t), '[{}"]', ''))) kv,
UNNEST([STRUCT(SPLIT(kv, ':')[OFFSET(0)] AS key, SPLIT(kv, ':')[OFFSET(1)] AS value)])
WHERE NOT key = 'problem_type'
GROUP BY problem_type, key

с результатом

Row problem_type    key         sum_value    
1   1               value_1     12   
2   1               value_2     15   
3   1               value_3     18   
4   2               value_1     31   
5   2               value_2     33   
6   2               value_3     35   

так, как вы можете видеть вместо того, что вы просили изначально - что-то вроде ниже

Row problem_type    value_1    value_2    value_3 
1   1               12         15         18     
2   2               31         33         35   

Но я думаю, что это разумная альтернатива, особенно если количество таких столбцов достаточно большое, чтобы тратить время и вводить все столбцы явно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...