原帖如下,有部分答案和演示数据代码。http://topic.csdn.net/u/20120524/13/75fb53ad-ee10-40b2-8d26-d577bf9a2930.html
表A的结构如下:客户 类型 金额 还款日期 还款
甲 A 20 2012/5/10
甲 B 40 2012/5/10
乙 A 60 2012/5/20
乙 C 70 2012/5/20 70
乙 B 80 2012/5/20 80SQL条件如下:
1、首先取得系统日期,按照系统日期减去还款日期,大于5天的记录提取出来。
2、对于取出的记录,我们判断该客户是否有还款,那么将还款字段按照客户进行求和,那么甲为0,乙为150
3、对还款为0的客户,我们将按照类型A,B,C的金额求和进行罚款(这里的罚款金额:20+40=60),罚款比率参照,表B,。60*0.05*6天=18元。如果金额小于20,那么就罚款20.
表B
客户 比率
甲 0.05
乙 0.044、最终得到一个记录,插入表A,定义类型为D(即罚款类型):
客户 类型 金额 还款日期 还款
甲 D 20 2012-5-24
5、超过5天以后,每一天运算一次。然后累加进去,那么5月25日的罚款金额为:
60*0.05*7=21
5月26日就为:60*0.05*8=28在58日,就应该更新为:
客户 类型 金额 还款日期 还款
甲 D 28 2012-5-24SQL codeCREATE TABLE #A
(
客户 nvarchar(50),
类型 nvarchar(50),
金额 int,
还款日期 datetime,
还款 int
)CREATE TABLE #B
(
 客户 NVARCHAR(50),
 比率 INT
)
INSERT INTO #B
SELECT '甲', 10 UNION
SELECT '乙', 20
INSERT INTO #A
SELECT '甲','A', 20, '2012/5/10',NULL UNION ALL
SELECT '甲','B', 40, '2012/5/10',NULL UNION ALL
SELECT '乙','A', 60, '2012/5/19',NULL UNION ALL
SELECT '乙','C', 70 ,'2012/5/20',70 UNION ALL
SELECT '乙','B', 80, '2012/5/20',80

解决方案 »

  1.   

     有难度, 建议LZ给点money 我帮你
      

  2.   


    CREATE TABLE #A
    (
      CustomName nvarchar(50),--客户关系号
      ContractNm nvarchar(50),--合同号
      LoanBlankDate datetime,--规定还款期
      BackType NVARCHAR(50),--还款类型
      LoanMoney float,--还款金额
      BackMoney float,--已还金额
      BackDate datetime --还款期
    )
    CREATE TABLE #B
    (
      CustomName nvarchar(50),--客户关系号
      Interest float --罚款利息
    )INSERT INTO #A
    SELECT '6000001','1','2012-5-19','PeriodCapital',10000,NULL,NULL UNION
    SELECT '6000001','1','2012-5-19','PeriodCapital',20000,NULL,NULL UNION
    SELECT '6000001','1','2012-5-19','PeriodInterst',30000,NULL,NULL UNION
    SELECT '6000002','2','2012-5-20','PeriodInterst',400,400,NULL UNION
    SELECT '6000002','2','2012-5-20','PeriodMangeCharge',500,500,NULL 
    INSERT INTO #B
    SELECT '6000001',0.15 UNION
    SELECT '6000002',0.16INSERT INTO #A
    SELECT a.CustomName,a.ContractNm,NULL,'PeriodOverdueCharge' BackType,CASE  WHEN a.LoanMoney*b.Interest/365*Datediff(day,LoanBlankDate,getdate())<150 THEN 150 ELSE a.LoanMoney*b.Interest/365*Datediff(day,LoanBlankDate,getdate()) END  LoanMoney,NULL,NULL FROM 
    (
    SELECT CustomName,ContractNm,SUM(ISNULL(BackMoney,0))BackMoney,SUM(ISNULL(LoanMoney,0))LoanMoney,LoanBlankDate FROM #A WHERE DATEDIFF(day,LoanBlankDate,GETDATE())>5 
    AND BackType IN ('PeriodCapital','PeriodInterst','PeriodMangeCharge') GROUP BY CustomName,LoanBlankDate,ContractNm
    ) AS a
    LEFT JOIN  #B b ON b.CustomName=a.CustomName
    WHERE a.BackMoney=0 SELECT * FROM #ADROP TABLE #A
    DROP TABLE #B