Oracle SQL:使用 SUM OVER PARTITION 更新表
Posted
技术标签:
【中文标题】Oracle SQL:使用 SUM OVER PARTITION 更新表【英文标题】:Oracle SQL: Update Table with SUM OVER PARTITION 【发布时间】:2018-09-04 09:07:10 【问题描述】:我一直在尝试做以下事情:
CREATE TABLE T_example
(category number(1,0),
amount number(4,0),
amount2 number(4,0))
INSERT INTO T_example VALUES (1,20,40);
INSERT INTO T_example VALUES (1,30,40);
INSERT INTO T_example VALUES (2,5,60);
INSERT INTO T_example VALUES (2,15,60);
INSERT INTO T_example VALUES (2,30,60);
如您所见,所有行在其类别中都包含相同的数量2。现在我想根据金额与类别的分布在每个类别中分配amount2。
UPDATE T_example
SET amount2 = amount2 * amount / SUM(amount) OVER (PARTITION BY category ORDER BY category);
我想得到:
category - amount - amount2
1 - 20 - 16
1 - 30 - 24
2 - 5 - 6
2 - 15 - 18
2 - 30 - 36
但代码不起作用。它说:
00934.00000 - “此处不允许使用群组功能”
你能告诉我哪里错了吗?
【问题讨论】:
【参考方案1】:我认为下面会为你工作,相关的子查询
UPDATE T_example t1
SET t1.amount2 = (t1.amount*t1.amount2) / (
select sum(amount) from -- from was missing
T_example t2 where t2.category=t1.category
group by category
);
https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=e2c00fe7ad8866bb4a62f66b08133f95
CATEGORY AMOUNT AMOUNT2
1 20 16
1 30 24
2 5 6
2 15 18
2 30 36
【讨论】:
这确实有效,但它似乎很复杂,因为我想在真实案例中为多个列执行此操作。有没有办法让 SUM... OVER 在这个场景中工作? @JForFun 您可以尝试创建子查询,因为它可能会起作用以上是关于Oracle SQL:使用 SUM OVER PARTITION 更新表的主要内容,如果未能解决你的问题,请参考以下文章