表 核销类别
字段 核销类别
记录 自动
     手动表 客户档案
客户编码(PK), 客户名称, 账期, 信用额表 应收借方
借方单据号(PK),客户编码(FK), 发生时间, 金额表 应收贷方
贷方单据号(PK),客户编码(FK), 发生时间, 金额, 核销类别(FK)表 核销对照
借方单据号(PK), 贷方单据号(PK), 核销金额, 核销时间题目1:
把自动核销的贷方单据余额,自动按照发生时间核销借方余额,填写核销时间为当前时间
题目2:
生成如下统计表
客户编码, 客户名称, 账期, 信用额,应收借方合计,应收贷方合计, 超过账期的应收余额,
超过账期少于30天的应收余额(账龄<30),超过账期30-60天的应收余额(30<=账龄<=60),
超过账期大于60天的应收余额(账龄>60)
--------------------------------------------
--名词解释
--账期,比如说是30天,表示30天内我不催款.
/**
信用额表示客户最多欠的金额比如信用额200元就表示我可以欠给客户200元,
一旦超过这个金额我就要催款,也就是借方余额的总和与信用额来比较,
而借方有余额的,要看看已经发生了多少天,如果发生的天数超过了账期,就要催款.
所以信用额,账期,表示我设定的底线
分别对应于借方余额,账龄.
*****/
--账龄就是某一笔应收借方已经发生了多久
------------------------------------------------------------------------
--创建测试表插入测试数据
if object_id('核销类别') is not null 
drop table 核销类别
go
create table 核销类别(核销类别 varchar(10) primary key )
insert 核销类别 
select '自动' union all
select '手动'goif object_id('客户档案') is not null 
drop table 客户档案
go
create table 客户档案(客户编码 varchar(10) primary key,客户名称 varchar(10),
账期 int,信用额 float)
goif object_id('应收借方') is not null 
drop table 应收借方
go
create table 应收借方(借方单据号 varchar(10) primary key,
          客户编码 varchar(10),
          发生时间 datetime,
          金额 float,
          foreign key(客户编码) references  客户档案(客户编码))
goif object_id('应收贷方') is not null 
drop table 应收贷方
go
create table 应收贷方(贷方单据号 varchar(10) primary key,
          客户编码 varchar(10),
          发生时间 datetime,
          金额 float,
          核销类别 varchar(10),
          foreign key(客户编码) references  客户档案(客户编码),
          foreign key(核销类别) references  核销类别(核销类别))
go
if object_id('核销对照') is not null 
drop table 核销对照
go
create table 核销对照(借方单据号 varchar(10) ,
            贷方单据号 varchar(10) ,
            核销金额 float,
            核销时间 datetime,
            CONSTRAINT 单据号 PRIMARY KEY (借方单据号,贷方单据号))
---------------------------------------------------------------------------
insert dbo.客户档案
select '001','a',30,'100000' union all
select '002','b',40,'150000' 
go--1月1号我卖给客户a100元东西,他还没付钱
insert dbo.应收借方
select '借001','001',0101,100
go
--1月2号我卖给客户a200元东西,他还没付钱
insert dbo.应收借方
select '借002','001',0102,200
--1月3号 客户a付了150元
insert 应收贷方 
select '贷001','001',0103,150,'手动'
--1月4号 客户a说,这150元,付第一次那笔款的50元,第二此那笔款的100元
insert 核销对照 
select '借001','贷001',50,0104 union all
select '借002','贷001',100,0104
--1月5号客户a又付200元,说把以前没结清的都结清,剩余前先存着
insert 应收贷方 
select '贷002','001',0105,200,'自动'-------------------------------------------------
--1月6号我卖给客户b1000元东西,他还没付钱
insert dbo.应收借方
select '借003','002',0106,1000
go
--1月7号我卖给客户b2000元东西,他还没付钱
insert dbo.应收借方
select '借004','002',0107,2000
--1月8号 客户b付了1500元
insert 应收贷方 
select '贷003','002',0108,1500,'手动'
--1月9号 客户b说,这1500元,付第一次那笔款的500元,第二此那笔款的1000元
insert 核销对照 
select '借003','贷003',500,0104 union all
select '借004','贷003',1000,0104

解决方案 »

  1.   


    --1.
    update 核销对照 set 核销时间 = getdate() 
    from 核销对照 a left join 应收贷方 b
    on a.贷方单据号= b.贷方单据号
    left join 核销类别 c on b.核销类别 = c.核销类别
    where c.记录 = '自动'
      

  2.   


    select  x.*,y.应收贷方合计,z.超过账期的应收余额,z.[应收余额30],z.[应收余额30-60],z.[应收余额60] from 
    (select a.客户编码,a.客户名称,a.账期,a.信用额,sum(b.金额) as 应收借方合计
    from dbo.客户档案 a join dbo.应收借方 b
    on a.客户编码=b.客户编码 
    group by a.客户编码,a.客户名称,a.账期,a.信用额) x  join
     
    (select a.客户编码,sum(b.金额) as 应收贷方合计
    from dbo.客户档案 a, dbo.应收贷方 b
    where a.客户编码=b.客户编码 
    group by a.客户编码,a.客户名称,a.账期,a.信用额) y   on x.客户编码=y.客户编码 join(select d.客户编码,sum(超过账期的应收余额) as 超过账期的应收余额,sum([应收余额30]) as [应收余额30],
           sum([应收余额30-60]) as [应收余额30-60],sum([应收余额60]) as 应收余额60
    from (select a.客户编码,a.金额-b.核销金额 as 超过账期的应收余额,
    case when datediff(day,a.发生时间, getdate())<30 then a.金额-b.核销金额 end  as [应收余额30],
    case when datediff(day,a.发生时间, getdate())>=30 and datediff(day,a.发生时间, getdate())<=60  then a.金额-b.核销金额 end  as [应收余额30-60],
    case when datediff(day,a.发生时间, getdate())>60   then a.金额-b.核销金额 end  as [应收余额60] 
    from dbo.应收借方 a join dbo.核销对照 b
    on a.借方单据号=b.借方单据号 join  dbo.客户档案 c on a.客户编码=c.客户编码 
    and datediff(day,a.发生时间, getdate())>c.账期 ) d
    group by d.客户编码) z  on y.客户编码=z.客户编码因为第二问比第一问简单,先做的第二问,但是感觉很乱,用的都是导出表,有没有人能改造的思路简单点
      

  3.   

    -------------------
    是啊,光弄清楚这个问题旧的半天,谁有那份闲心呢,没办法 ,工作啊问个基础问题,我们工作中一般不允许用导出表,尽量用连接,那么是不是用导出表的地方地方都能用连接?
    ps 导出表 select * from (select * from a)这就是个典型的导出表。
      

  4.   

    ---------------------------
    这是个财务有关的,所以需求没说清,我得问题
    15#想要的结果是
    insert 核销对照
    select 借001 贷002 50  2011-08-16 00:00:00.000  union all
    select 借002 贷002 100 2011-08-16 00:00:00.000  union all
    select 借003 贷002 50  2011-08-16 00:00:00.000 
    ---------------------------------------------------
    首先感谢你们的帮忙,这个题关联到财务方面的知识,一点一旦,请您耐心看完
    在财务管理上,常常要核销账单
    自动核销,就是客户说,“我这笔付的钱,你按以前我欠的钱,从前到后,能核销多少就核销多少”
    手动核销,就是客户说,“我给你这笔钱,你不要随便核销,我通知你说付的是哪笔你就算哪笔”
    核销简单理解就是冲账,借和贷一样就可以消掉。
     
      

  5.   

    --------------------
    看来你懂财务,麻烦你费点时间看看,我上面写有测试数据,就是财务自动核销问题,题目一可以写成一个存储过程或者sql语句都可,题目二我会了
      

  6.   

    [Quote=引用 30 楼 fstao 的回复:]
    其实自动核销贷方的金额,是就是相当于,有好几笔销售单,比如有6笔销售单,其中4笔销售单已经收完款了。
    那销售单的凭证写法是:
    借应收账款 1000
    贷主营业收入 1000如果收了款是1000元,则凭证写法是:
    借现金(或银行存款) 1000
    贷应收账款 1000
    -----------------
    您说的这种情况很少,实际中比如A客户第一天买了1000的东西,没付款,第二天又买了2000的东西没付款,第三天又买了1000的东西没付款,第四天付了1000用于核销第一天的500和第二天的500,第五天付了1500,用于核销第一天的500和第二天的500,第六次付了4000用于核销以前的欠款,剩下的钱先存着备用,
    你该怎么核销?
      

  7.   

    ------------------------
    题目一要求写出一条sql语句或者存储过程
      

  8.   

    ,实际中比如A客户第一天买了1000的东西,没付款,第二天又买了2000的东西没付款,第三天又买了1000的东西没付款,第四天付了1000用于核销第一天的500和第二天的500,第五天付了1500,用于核销第一天的500和第二天的500,第六天付了4000用于核销以前的欠款,剩下的钱先存着备用,
    ---------------------------------------
    这种情况第六天就是自动核销,该怎么写sql??????
      

  9.   

    -----------------------------------
    恩,我想的和你差不多,就是sql不会写啊!
      

  10.   

    攫--------------------
    我上面有测试数据,你能试着写下sql语句吗,不一定要存储过程,sql句子也行
      

  11.   

    这个如果非要SQL实现的话,只能用存储过程。对于存储过程不太熟,爱莫能助!
      

  12.   

    这个问题不能有sql解决,应该通过每天的日结把账期先算出来,再按账期查询就得了。