我有一张像这样的桌子:
身份证 | 类型 | 姓名 | 成本 |
---|---|---|---|
a1 | 顾客 | 约翰 | 2 |
a1 | 顾客 | 杰克 | 2 |
a1 | 客户 | 弗兰克 | 2 |
a1 | 环境 | 开发 | 6 |
a1 | 销售 | 满 | 6 |
a2 | 顾客 | 安东尼 | 3 |
a2 | 顾客 | 杰夫 | 3 |
a2 | 客户 | 标记 | 3 |
a2 | 客户 | 约翰 | 3 |
a2 | 顾客 | 杰克 | 3 |
a2 | 环境 | 测试 | 7.5 |
a2 | 环境 | 开发 | 7.5 |
a2 | 销售 | 部分 | 15 |
我需要以这样的方式对其进行转换,使类型成为列,并且成本如下所示:
身份证 | 客户 | 环境 | 销售 | 成本 |
---|---|---|---|---|
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 |
我这样使得成本总和与表1中的数字一致。 我不确定是否可以通过某种枢轴或某种连接来获得它。
谢谢
使用以下方法
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)
如果应用于问题中的样本数据 - 输出为