表 A 里有如下数。
收支明细(SZMX) 收入金额 (SRJE) 支出金额(ZCJE) 明细序号(XLH)
A 100 0 1
B 200 0 2
C 0 300 3
D 0 50 4
H 100 30 5
F 50 100 6
.. .. .. ..
.. .. .. ..
n n n n
写个什么SQL语句。能把表A里的数据写到表里B 并得到下面的数据(表B):
里面的结存金额=上次的结存金额+收入金额-支出金额 收支明细(SZMX) 收入金额 (SRJE) 支出金额(ZCJE) 结存金额(JCJE) 明细序号(XLH)
.. .. .. 1000 7
VV 170 80 1090 8 --此行以上是以前的数据。
A 100 0 1190 1
B 200 0 1390 2
C 0 300 1090 3
D 0 50 1040 4
H 100 30 1110 5
F 50 100 1060 6
.. .. .. .. ..
.. .. .. .. ..
N N N N N
解决方案 »
- ADO循环语句怎么转成sql语句
- 请问各位大哥, 你们产品信息表一般怎么设计?
- 请教高手
- 关于jdbc连接sqlserver存储过程内部的变量问题,请高手们帮忙!!!!
- sql server profiler 怎么查看数据库服务器性能?
- sql2005 和sql2000 两个都安装 关了2005的 1433端口也自动关闭,怎么办?
- 怎样可以使这样的查询可以在access中间运行,怎么改?
- 多表查询的问题跪求
- 用pb自带带的数据库转换成SQL SERVER后,为什么程序出现了好多错误
- datediff计算出的字段如何在同一个程序中被其他函数应用
- SQL更新难点
- sql server中无线级分类作为子查询的问题
收支明细(SZMX) 收入金额 (SRJE) 支出金额(ZCJE) 明细序号(XLH)
A 100 0 1
B 200 0 2
C 0 300 3
D 0 50 4
H 100 30 5
F 50 100 6
.. .. .. ..
.. .. .. ..
n n n n表B:
收支明细(SZMX) 收入金额 (SRJE) 支出金额(ZCJE) 结存金额(JCJE) 明细序号(XLH)
.. .. .. 1000 7
VV 170 80 1090 8 --此行以上是以前的数据。
A 100 0 1190 1
B 200 0 1390 2
C 0 300 1090 3
D 0 50 1040 4
H 100 30 1110 5
F 50 100 1060 6
.. .. .. .. ..
.. .. .. .. ..
N N N N N
if object_id('tempdb.dbo.#tb') is not null drop table #tb
go
create table #tb (SZMX varchar(1),SRJE int,ZCJE int,XLH int)
insert into #tb
select 'A',100,0,1 union all
select 'B',200,0,2 union all
select 'C',0,300,3 union all
select 'D',0,50,4 union all
select 'H',100,30,5 union all
select 'F',50,100,6
select *,jcje=(select sum(SRJE)-sum(ZCJE) from #tb where XLH<=t.XLH)
from #tb tSZMX SRJE ZCJE XLH jcje
---- ----------- ----------- ----------- -----------
A 100 0 1 100
B 200 0 2 300
C 0 300 3 0
D 0 50 4 -50
H 100 30 5 20
F 50 100 6 -30(6 行受影响)如果直接导入到b中
就在前面加个 insert tb select
b表的数据 的最后一笔 + 收入金额 (SRJE)- 支出金额(ZCJE)
group by a.SZMX ,a.XLH
b表原来的数据 的最后一笔的 结存资金
加上a表下一笔数据的 收入 再减去支出
这个就是结存资金
其他数据 照搬过来。。主要难点是的第一笔数据来源a
结存资金需要 用到 b的结存资金
但是我明白了你的意思 ,我的逻辑应该没错。。
create or replace procedure test is
newjczj number;
begin
for rec in(
select jczj into newjczj from b where rownum=1 order by xlh desc
insert into b select a.SZMX,a.SRJE,a.ZCJE,(newjczj+a.srje-a.zcje) as JCJE,a.XLH from a
)loop
end test;
我里面那个select 不是查一笔数据 是整个a表数据 外面再循环就。不对了。。
如果不删掉,下次再有数据插入到A表,那怎么知道哪些意见统计过,哪些没有统计过。
这些楼主都没有描述。
if object_id('tempdb.dbo.#tb') is not null drop table #tb
go
create table #tb (SZMX varchar(1),SRJE int,ZCJE int,XLH int)
insert into #tb
select 'A',100,0,1 union all
select 'B',200,0,2 union all
select 'C',0,300,3 union all
select 'D',0,50,4 union all
select 'H',100,30,5 union all
select 'F',50,100,6if object_id('tempdb.dbo.#ta') is not null drop table #ta
go
create table #ta (SZMX varchar(1),SRJE int,ZCJE int,jcJE int,XLH int)
insert into #ta
select 'w',170,80,1090,8
insert into #ta
select SZMX,SRJE,ZCJE, jcje=(select top 1 jcJE from #ta order by xlh desc)
+isnull((select sum(SRJE)-sum(ZCJE) from #tb where xlh<=t.xlh),0)
,XLH
from #tb t
select * from #ta SZMX SRJE ZCJE jcJE XLH
---- ----------- ----------- ----------- -----------
w 170 80 1090 8
A 100 0 1190 1
B 200 0 1390 2
C 0 300 1090 3
D 0 50 1040 4
H 100 30 1110 5
F 50 100 1060 6(7 行受影响)
set QUOTED_IDENTIFIER ON
goALTER PROCEDURE [dbo].[test]
AS
declare @ajcje int,@number int,@number2 int
begin
set @ajcje=(select t.jcje from(select row_number() over(order by xlh desc) as num, JCJE from b) t where t.num=1)
set @number=(select count(*) from a)
set @number2=0;
while(@number>@number2)
begin
insert into b
select t.SRJE,t.ZCJE,t.jcje,t.XLH from
(select row_number()over(order by xlh desc)as num,
a.SRJE as SRJE,
a.ZCJE as ZCJE,
(@ajcje+a.SRJE-a.ZCJE) as jcje,
a.XLH as XLH from a) t
where t.num=@number2 set @number=@number+1
end
END我的少用了前面那个字段你自己加下忘记了
from #tb t
另外问下。这种语法。放在存贮过程里。执行的效率慢不慢啊。在大数据,多用户时候。