Oracle怎么写一个求余额的sql语句。

披着虎皮 的石头 2011-10-27 12:14:43
有一表tab1,表里有几个字段和记录:
SID InQty OutQty EndQty
001 2.5 1.5
002 3.5 2.5
003 4.5 1.5

怎么写sql语句,根据 上次余额 +InQty -OutQty =EndQty,更新EndQty值,结果为:
SID InQty OutQty EndQty
001 2.5 1.5 1
002 3.5 2.5 2
003 4.5 1.5 5

以前的sqlserver中,如下写法是对的,但到oracle中就报错:
update tab1
set EndQty = select Sum(InQty ) -Sum(OutQty)
from #tab1 where SID <=t.SID)
from #tab1 t


...全文
403 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
好复杂啊,运行报ORA-00969:缺少ON关键字。
BenChiM888 2011-10-27
  • 打赏
  • 举报
回复

MERGE INTO TAB1
USING (SELECT TMP.SID, SUM(TAB1.INQTY) - SUM(TAB1.OUTQTY) ENDQTY
FROM TAB1, TAB1 TMP
WHERE T1.SID <= TMP.SID
GROUP BY TMP.SID) B
ON TAB1.SID = B.SID
WHEN MATCHED THEN
UPDATE SET TAB1.ENDQTY = B.ENDQTY;

  • 打赏
  • 举报
回复
而且写成:
update tab1 t
set EndQty =Sum(tt.InQty) -Sum(tt.OutQty) from a tt where tt.SID <=t.SID)
WHERE EXISTS (SELECT * from a tt where tt.SID <=t.SID);

也会提示不能分组。
programmerxiaocai 2011-10-27
  • 打赏
  • 举报
回复
update tab1 tab set (tab.endqty)=(
select (select sum(ta.inqty-ta.outqty) from tab1 ta where ta.sid<=t.sid)
from tab1 t where tab.sid=t.sid)
BenChiM888 2011-10-27
  • 打赏
  • 举报
回复

MERGE INTO TAB1 t1
USING (SELECT TMP.SID, SUM(TAB1.INQTY) - SUM(TAB1.OUTQTY) ENDQTY
FROM TAB1, TAB1 TMP
WHERE TAB1.SID <= TMP.SID
GROUP BY TMP.SID) B
ON (t1.SID = B.SID)
WHEN MATCHED THEN
UPDATE SET t1.ENDQTY = B.ENDQTY;
--又忘记加括号了,日。

  • 打赏
  • 举报
回复

[Quote=引用 11 楼 benchim888 的回复:]

SQL code


MERGE INTO TAB1 t1
USING (SELECT TMP.SID, SUM(TAB1.INQTY) - SUM(TAB1.OUTQTY) ENDQTY
FROM TAB1, TAB1 TMP
WHERE TAB1.SID <= TMP.SID
GROUP BY TMP.SID) B
ON t1.SID = ……
[/Quote]
谢谢noteasytoregister,你的脚本是对的。

这个求余额的sql,
1 应该是单表更新,
2 而不是普通的多表更新,
3 oracle里单表更新,不能加from子句,而sqlserver中允许。


noteasytoregister 2011-10-27
  • 打赏
  • 举报
回复
update tab1 t1
set EndQty=(select sum(InQty-OutQty) from tab1 t2 where t2.SID<=t1.SID)
BenChiM888 2011-10-27
  • 打赏
  • 举报
回复


MERGE INTO TAB1 t1
USING (SELECT TMP.SID, SUM(TAB1.INQTY) - SUM(TAB1.OUTQTY) ENDQTY
FROM TAB1, TAB1 TMP
WHERE TAB1.SID <= TMP.SID
GROUP BY TMP.SID) B
ON t1.SID = B.SID
WHEN MATCHED THEN
UPDATE SET t1.ENDQTY = B.ENDQTY;

  • 打赏
  • 举报
回复
create table TAB1
(
SID VARCHAR2(50),
Inqty NUMBER(18,6),
OutQty NUMBER(18,6),
EndQty NUMBER(18,6)
);

insert into tab1 (SID, Inqty, OutQty)
values ('1', 1, 1);

insert into tab1 (SID, Inqty, OutQty)
values ('2', 2, 1);

insert into tab1 (SID, Inqty, OutQty)
values ('3', 3, 1);

--这里写更新EndQty值

select SID, Inqty, OutQty, EndQty from tab1
order by SID;
--结果为(上次余额+inQty -outQty =EndQty):
SID INQTY OutQty EndQty
1 1 1 0
2 2 1 1
3 3 1 3
  • 打赏
  • 举报
回复
各位大侠,写的sql,都不能通过编译,我重新写了建表和插数据的脚本,大家调试一下,测试一下结果。
  • 打赏
  • 举报
回复
create table TAB1
(
SID VARCHAR2(50),
Inqty NUMBER(18,6),
OutQty NUMBER(18,6),
EndQty NUMBER(18,6)
);

insert into tab1 (SID, Inqty, OutQty)
values ('1', 1, 1);

insert into tab1 (SID, Inqty, OutQty)
values ('2', 2, 1);

insert into tab1 (SID, Inqty, OutQty)
values ('3', 3, 1);

--这里写更新EndQty值

select SID, Inqty, OutQty, EndQty from tab1
order by SID;
--结果为(上次余额+inQty -outQty =EndQty):
SID INQTY OutQty EndQty
1 1 1 0
2 2 1 1
3 3 1 3
xiaobn_cn 2011-10-27
  • 打赏
  • 举报
回复
可以用分析函数来解决
with T as (
select '001' sid, 2.5 inqty,1.5 outqty from dual union
select '002',3.5,2.5 from dual union
select '003', 4.5,1.5 from dual)
-- 上面的是测试模拟数据,不需要引用
SELECT SID,OUTQTY,OUTQTY,SUM(INQTY - OUTQTY) OVER(ORDER BY SID) ENDQTY FROM T;
BenChiM888 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhuchuankun 的回复:]

好复杂啊,运行报ORA-00969:缺少ON关键字。
[/Quote]


ON TAB1.SID = B.SID 少个括号 sorry

ON (TAB1.SID = B.SID)
chenro 2011-10-27
  • 打赏
  • 举报
回复
update tab1
set endqty = (select t0.t_qty
from
(select *, sum(inqty - outqty) over(partition by sid) as t_qty
from tab1
) t0
where tab1.sid = t0.sid
)
中国风 2011-10-27
  • 打赏
  • 举报
回复
update t2
set EndQty=t1.TotalQty
from
(Select *,(select SUM(InQty-OutQty) from tab1 where SID<=a.SID) as TotalQty from tab1 as a)t1
inner join tab1 as t2 on t1.SID=t2.SID

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧