帮忙给个SQL语句啊。

asdfreww1 2010-12-17 03:43:25



表 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
...全文
151 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
asdfreww1 2010-12-17
  • 打赏
  • 举报
回复
水哥和OULINHNZZ 两位辛苦了。我在你们两的方案上再想想看能不能再优化点。
WaterGG 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 asdfreww1 的回复:]
select *,jcje=(select sum(SRJE)-sum(ZCJE) from #tb where XLH<=t.XLH)
from #tb t
另外问下。这种语法。放在存贮过程里。执行的效率慢不慢啊。在大数据,多用户时候。
[/Quote]18楼的写好了,这语句 ,基本没法再简化
asdfreww1 2010-12-17
  • 打赏
  • 举报
回复
select *,jcje=(select sum(SRJE)-sum(ZCJE) from #tb where XLH<=t.XLH)
from #tb t
另外问下。这种语法。放在存贮过程里。执行的效率慢不慢啊。在大数据,多用户时候。
  • 打赏
  • 举报
回复
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER 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

我的少用了前面那个字段你自己加下。。。忘记了
WaterGG 2010-12-17
  • 打赏
  • 举报
回复
#tb 往#ta 里插入数据
WaterGG 2010-12-17
  • 打赏
  • 举报
回复
--> 测试数据: #tb
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

if 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 行受影响)
asdfreww1 2010-12-17
  • 打赏
  • 举报
回复
A表是临时表。用完里面的数据就删掉了。B表是要用来存储数据的。
WaterGG 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 asdfreww1 的回复:]
五楼的水哥。写的很接近我想要的数据了。就是怎么把B表里最后一笔的结存金额也提出,从A表写到。B表里结存金额得包含B表最后一笔的结存金额的。(结存金额=上次的结存金额+收入金额-支出金额)
[/Quote]如果非要考虑那么全面的话,你B表最好要加一个自增列,一个标志列(标志是否是本次插入)统计比较方便,

而且,本次统计完,A表是不是数据要删掉?
如果不删掉,下次再有数据插入到A表,那怎么知道哪些意见统计过,哪些没有统计过。
这些楼主都没有描述。
asdfreww1 2010-12-17
  • 打赏
  • 举报
回复
五楼的水哥。写的很接近我想要的数据了。就是怎么把B表里最后一笔的结存金额也提出,从A表写到。B表里结存金额得包含B表最后一笔的结存金额的。(结存金额=上次的结存金额+收入金额-支出金额)
  • 打赏
  • 举报
回复
你稍等会。。我写个给你 刚才我的还是有点逻辑问题 不过差不多了。。
我里面那个select 不是查一笔数据 是整个a表数据 外面再循环就。不对了。。
asdfreww1 2010-12-17
  • 打赏
  • 举报
回复
才看到没注明啊。我要sqlserver版本的。
asdfreww1 2010-12-17
  • 打赏
  • 举报
回复
谢谢啊。这个表难就是难在:B表里的结存金额上,别的数据就是直接写入就行了了:结存金额=上次的结存金额+收入金额-支出金额。
  • 打赏
  • 举报
回复
小弟功底不够,提供一 oracle存储过程 如果存在语法错误。。请见谅 。。
但是我明白了你的意思 ,我的逻辑应该没错。。
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;
  • 打赏
  • 举报
回复
存放方式很明显了
b表原来的数据 的最后一笔的 结存资金
加上a表下一笔数据的 收入 再减去支出
这个就是结存资金
其他数据 照搬过来。。主要难点是的第一笔数据来源a
结存资金需要 用到 b的结存资金
WaterGG 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 oulinhnzz 的回复:]
楼上这样不行的 他b表本身有数据的你要把
b表的数据 的最后一笔 + 收入金额 (SRJE)- 支出金额(ZCJE)
[/Quote]我这是单表,2表要看他的数据时怎么存放的
飘零一叶 2010-12-17
  • 打赏
  • 举报
回复
SELECT a.SZMX,sum(a.SRJE) as SRJE,sum(a.ZCJE) as ZCJE,sum(b.JCJE+a.SRJE-a.ZCJE) as JCJE ,a.XLH from a join b on a.SZMX=b.SZMX and a.XLH=b.XLH
group by a.SZMX ,a.XLH
  • 打赏
  • 举报
回复
楼上这样不行的 他b表本身有数据的你要把
b表的数据 的最后一笔 + 收入金额 (SRJE)- 支出金额(ZCJE)
WaterGG 2010-12-17
  • 打赏
  • 举报
回复
--> 测试数据: #tb
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 t

SZMX 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 。。。
  • 打赏
  • 举报
回复
要oracle版本还是sqlserver版本?
修改一下昵称 2010-12-17
  • 打赏
  • 举报
回复

--你用代码格式把数据调整一下,看的头晕...
加载更多回复(2)

22,294

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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