【问题标题】:SQL: calculate the sum of each column and convert them into rowsSQL:计算每列的总和并将它们转换为行
【发布时间】:2021-09-13 15:18:53
【问题描述】:

我当前的表包含 100 多列,我需要计算每列的总和并将它们转换为行。由于列数超过 100 列,使用 unpivote 子句不太方便。有没有其他方法可以做到这一点? 下面是原始表的快照:

col1 col2
23 44
33 45

这是我需要的:

variable sum_variable
col1 56
col2 89

你能帮我解决这个问题吗?

【问题讨论】:

  • 简短的回答是否定的,没有方便的方式。这样做的需要/愿望通常表明需要“修复”initial 数据结构。也就是说,BigQuery 故意是一个列式数据库。这带来了许多优势,以及您将致力于特定模式的期望。因此,一个相关的问题变成了;你为什么要避免 bigquery 期望的柱状模式?这可能表明您使用了错误的数据库?

标签: sql database google-bigquery


【解决方案1】:

考虑下面

select split(kv, ':')[offset(0)] as variable, 
  sum(cast(split(kv, ':')[offset(1)] as int64)) as sum_variable
from data t, unnest(split(translate(to_json_string(t), '{}"', ''))) kv
group by variable          

如果应用于您问题中的样本数据 - 输出是

【讨论】:

  • 大声笑,编码为 json 然后取消嵌套,聪明。
  • 是的,我同意 - 在这种情况下使用 unpivot 不太实用,所以我删除了我最初的答案
  • 现在,在 OP 将 {}" 放入列名之后执行此操作;)
  • Fields must contain only letters, numbers, and underscores, start with a letter or underscore, and be at most 300 characters long.
  • @MikhailBerlyant 非常感谢!有效!!如果你不介意,我想问另一个问题。现在我不想求和,而是想看看我是否可以计算输入和输出变量之间的相关性。我将查询写为(Avg(y * x) - (Avg(x) * Avg(y))) / (stddev(x) * stddev(y)) AS pearson。你知道我可以用我写的内容替换差异条款吗?
猜你喜欢
  • 2022-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多