12
返回列表 发新帖
楼主: szminggong

[讨论] 求一个SQL语句 付款记录按日期顺冲申请付款记录

[复制链接]
论坛徽章:
0
11#
 楼主| 发表于 2016-9-1 20:27 | 只看该作者
胜利在望了 多谢

使用道具 举报

回复
论坛徽章:
241
至尊黑钻
日期:2015-09-25 14:27:26粉钻
日期:2015-10-16 10:53:36紫钻
日期:2015-10-16 10:53:21红钻
日期:2015-09-25 15:05:50黄钻
日期:2015-10-17 12:23:40绿钻
日期:2015-10-24 10:29:30至尊黑钻
日期:2015-08-14 13:24:07粉钻
日期:2015-10-24 10:30:07紫钻
日期:2015-11-03 22:32:09红钻
日期:2015-11-06 17:21:40
12#
发表于 2016-9-2 09:33 | 只看该作者
szminggong 发表于 2016-9-1 20:26
发现一个问题,假如我只保留tb的记录,ta的记录全部删除,得到的结果如下
date        remark        pay        pay_t
2016-05 ...

第二条数据里的5000要变成1500吧?

使用道具 举报

回复
论坛徽章:
0
13#
 楼主| 发表于 2016-9-2 11:34 | 只看该作者
老师,你这样试试
if not object_id(N'Tempdb..ta') is null  drop table ta
Create table Ta(date Datetime,remark nvarchar(260),pay int,pay_t int)
if not object_id(N'Tempdb..tb') is null  drop table tb
Create table Tb(date Datetime,remark nvarchar(260),pay int,pay_t int)
Insert tb
select '2016-05-22',N'申请付款',0,2500 union all
select '2016-05-23',N'申请付款',0,5000 union all
select '2016-05-24',N'申请付款',0,6000 union all
select '2016-05-25',N'申请付款',0,9000
Go
exec sp_tt
结果是如下
date        remark        pay        pay_t
2016-05-22 00:00:00.000        申请付款        0        NULL
2016-05-23 00:00:00.000        申请付款        0        5000
2016-05-24 00:00:00.000        申请付款        0        6000
2016-05-25 00:00:00.000        申请付款        0        9000
红色的地方是错误的,因为原表ta是空的,所以那里不应该被冲掉

使用道具 举报

回复
论坛徽章:
241
至尊黑钻
日期:2015-09-25 14:27:26粉钻
日期:2015-10-16 10:53:36紫钻
日期:2015-10-16 10:53:21红钻
日期:2015-09-25 15:05:50黄钻
日期:2015-10-17 12:23:40绿钻
日期:2015-10-24 10:29:30至尊黑钻
日期:2015-08-14 13:24:07粉钻
日期:2015-10-24 10:30:07紫钻
日期:2015-11-03 22:32:09红钻
日期:2015-11-06 17:21:40
14#
发表于 2016-9-2 12:22 | 只看该作者
本帖最后由 佚名是译名 于 2016-9-2 12:29 编辑
szminggong 发表于 2016-9-2 11:34
老师,你这样试试
if not object_id(N'Tempdb..ta') is null  drop table ta
Create table Ta(date Datet ...


alter procedure sp_tt as
begin
declare @date datetime,@remark nvarchar(26),@pay_t int,@sum_pay_t int,@sum_pay int,@fs int
set @fs= 1
select @sum_pay= sum(pay)  from ta
if @sum_pay is null begin
        set @sum_pay = 0
end
create table #tc (date Datetime,remark nvarchar(26),pay int,pay_t int)
declare tc_cursor cursor LOCAL STATIC FOR
select date,remark,pay_t from tb
open tc_cursor
fetch tc_cursor into @date,@remark,@pay_t
while @@fetch_status=0 begin
        if @pay_t <= @sum_pay begin
                set @sum_pay = @sum_pay - @pay_t
        end
        else begin
                set @sum_pay_t = @pay_t - @sum_pay         
                if @fs <> 0 begin
                        insert into #tc (date,remark,pay,pay_t)
                                values(@date,@remark,0,@sum_pay_t)
                        set @fs = 0
                end
                else begin
                        insert into #tc (date,remark,pay,pay_t)
                                values(@date,@remark,0,@pay_t)
                end
        end
        fetch tc_cursor into @date,@remark,@pay_t
end
close tc_cursor
deallocate tc_cursor
select * from #tc                        
end

@sum_pay这个值为空引起的问题,现在修正了,你再试试。PS 不用喊老师吧,我也没多大。

使用道具 举报

回复
论坛徽章:
0
15#
 楼主| 发表于 2016-9-2 15:10 | 只看该作者

保留tb的记录,删除ta的记录达到效果了;但是假如保留ta,删除tb的记录,又不行了。这种情况应该只显示ta表的记录
if not object_id(N'Tempdb..ta') is null  drop table ta
Create table Ta(date Datetime,remark nvarchar(260),pay int,pay_t int)
insert into Ta
select '2016-06-01',N'向A公司付款',1000,0 union all
select '2016-06-02',N'向A公司付款',2000,0 union all
select '2016-06-03',N'向A公司付款',3000,0

if not object_id(N'Tempdb..tb') is null  drop table tb
Create table Tb(date Datetime,remark nvarchar(260),pay int,pay_t int)
--Insert tb
--select '2016-05-22',N'申请付款',0,2500 union all
--select '2016-05-23',N'申请付款',0,5000 union all
--select '2016-05-24',N'申请付款',0,6000 union all
--select '2016-05-25',N'申请付款',0,9000
Go

exec sp_tt

其实你第一个存储过程都达到要求了,就是那个NULL不对。现在搞出新问题了。

使用道具 举报

回复
论坛徽章:
241
至尊黑钻
日期:2015-09-25 14:27:26粉钻
日期:2015-10-16 10:53:36紫钻
日期:2015-10-16 10:53:21红钻
日期:2015-09-25 15:05:50黄钻
日期:2015-10-17 12:23:40绿钻
日期:2015-10-24 10:29:30至尊黑钻
日期:2015-08-14 13:24:07粉钻
日期:2015-10-24 10:30:07紫钻
日期:2015-11-03 22:32:09红钻
日期:2015-11-06 17:21:40
16#
发表于 2016-9-2 15:23 | 只看该作者
szminggong 发表于 2016-9-2 15:10
保留tb的记录,删除ta的记录达到效果了;但是假如保留ta,删除tb的记录,又不行了。这种情况应该只显示ta ...

alter procedure sp_tt as
begin
declare @date datetime,@remark nvarchar(26),@pay_t int,@sum_pay_t int,@sum_pay int,@fs int
set @fs= 1
select @sum_pay= sum(pay)  from ta
if @sum_pay is null begin
        set @sum_pay = 0
end
create table #tc (date Datetime,remark nvarchar(26),pay int,pay_t int)
insert into #tc(date,remark,pay,pay_t)
select date,remark,pay,pay_t from ta
declare tc_cursor cursor LOCAL STATIC FOR
select date,remark,pay_t from tb
open tc_cursor
fetch tc_cursor into @date,@remark,@pay_t
while @@fetch_status=0 begin
        if @pay_t <= @sum_pay begin
                set @sum_pay = @sum_pay - @pay_t
        end
        else begin
                set @sum_pay_t = @pay_t - @sum_pay         
                if @fs <> 0 begin
                        insert into #tc (date,remark,pay,pay_t)
                                values(@date,@remark,0,@sum_pay_t)
                        set @fs = 0
                end
                else begin
                        insert into #tc (date,remark,pay,pay_t)
                                values(@date,@remark,0,@pay_t)
                end
        end
        fetch tc_cursor into @date,@remark,@pay_t
end
close tc_cursor
deallocate tc_cursor
select * from #tc                        
end

上次我将A表的记录插入到临时表的那个insert语句去掉了,加上去就行了。

使用道具 举报

回复
论坛徽章:
0
17#
 楼主| 发表于 2016-9-2 15:40 | 只看该作者
本帖最后由 szminggong 于 2016-9-2 15:43 编辑

搞定了,打赏哈

使用道具 举报

回复
论坛徽章:
241
至尊黑钻
日期:2015-09-25 14:27:26粉钻
日期:2015-10-16 10:53:36紫钻
日期:2015-10-16 10:53:21红钻
日期:2015-09-25 15:05:50黄钻
日期:2015-10-17 12:23:40绿钻
日期:2015-10-24 10:29:30至尊黑钻
日期:2015-08-14 13:24:07粉钻
日期:2015-10-24 10:30:07紫钻
日期:2015-11-03 22:32:09红钻
日期:2015-11-06 17:21:40
18#
发表于 2016-9-2 16:12 | 只看该作者
谢老板打赏      

使用道具 举报

回复
论坛徽章:
0
19#
 楼主| 发表于 2016-9-3 10:38 | 只看该作者
大哥,我谢你!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表