我有一张像这样的桌子:
身份证 | 类型 | 姓名 | 全额费用 | 成本分摊 |
---|---|---|---|---|
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 了。
我不确定是否可以通过某种枢轴或某种连接来获得它。
谢谢
使用以下方法
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)
如果应用于问题中的样本数据 - 输出为
注意:以上是基于一些假设,不一定是你想要的