BigQuery 挑战:通过成本拆分来旋转客户表

问题描述 投票:0回答:1

我有一张像这样的桌子:

身份证 类型 姓名 全额费用 成本分摊
a1 顾客 约翰 6 2
a1 客户 杰克 6 2
a1 客户 弗兰克 6 2
a1 环境 开发 6 6
a1 销售 6 6
a2 客户 安东尼 15 3
a2 客户 杰夫 15 3
a2 顾客 标记 15 3
a2 顾客 约翰 15 3
a2 顾客 杰克 15 3
a2 环境 测试 15 7.5
a2 环境 开发 15 7.5
a2 销售 部分 15 15

在此数据中,每个 ID 都有完整成本,并在 FULL COST 中报告。成本分割只是每种类型内全部成本的分割。例如,在 ID=a1 中,全部成本为 6,并且由于有 3 个客户,因此成本分摊为 2。只有一种环境,因此成本分摊 = 6,并且只有 1 笔销售,因此成本分摊 = 6。相同的机制ID=a2.

现在我需要以这样的方式转换上表,使类型变成列,并且成本分割如下分布(我不会在这里再次放置全部成本,但如果需要的话我们可以使用它):

身份证 顾客 环境 销售 成本分摊
a1 约翰 开发 2
a1 杰克 开发 2
a1 弗兰克 开发 2
a2 安东尼 测试 部分 1.5
a2 杰夫 测试 部分 1.5
a2 标记 测试 部分 1.5
a2 约翰 测试 部分 1.5
a2 杰克 测试 部分 1.5
a2 安东尼 开发 部分 1.5
a2 杰夫 开发 部分 1.5
a2 标记 开发 部分 1.5
a2 约翰 开发 部分 1.5
a2 杰克 开发 部分 1.5

你能看出区别吗?基本上,在最终表中,对于每个 ID 组,我需要为每个 TYPE 组合一行;即对于 a1 -> john - dev - full、jack - dev - full、frank - dev - full。"现在� 7563 � COST SPLIT 必须是这样的,即每个 TYPE 值的总和返回表 1 的 COST SPLIT。因此 john jack 和 Frank 的成本分别为 2 和之前一样,“dev”重复 3 次,因此为 6,同样如此"为“满”。 现在你可以明白为什么 ID=a2 一切都变成 1.5 了。

我不确定是否可以通过某种枢轴或某种连接来获得它。

谢谢

google-bigquery pivot
1个回答
0
投票

使用以下方法

SELECT 
  ID,
  customer,
  environment,
  sales,
  cost / COUNT(DISTINCT environment) OVER(PARTITION BY ID) AS cost
FROM UNNEST(ARRAY(SELECT AS STRUCT ID, name AS customer, cost FROM your_table WHERE type = 'customer'))
JOIN UNNEST(ARRAY(SELECT AS STRUCT ID, name AS environment FROM your_table WHERE type = 'environment')) USING(ID)
JOIN UNNEST(ARRAY(SELECT AS STRUCT ID, name AS sales FROM your_table WHERE type = 'sales')) USING(ID)  

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

注意:以上是基于一些假设,不一定是你想要的

© www.soinside.com 2019 - 2024. All rights reserved.