2014-02-18 45 views
2

我有寫一個MS-SQL存儲過程的要求,要求是 表1
它包括學生總費用分期支付 EX:計數分期付款

SID SNAME  INST.Date Amount 

123  XYZ  01-01-2013 3500 
123  XYZ  01-05-2013 3500 
123  XYZ  01-10-2013 3500 
123  XYZ  01-04-2014 3500 
123  XYZ  01-06-2014 3500 

`
表2
它由付款RECD細節

SID  SNAME Paydate amoount 
123  XYZ  01-01-2013 1167 
123  XYZ  01-02-2013 1167 
123  XYZ  01-03-2013 1167 
123  XYZ  01-05-2013 1750 
123  XYZ  01-05-2013 1750 
123  XYZ  01-10-2013 1167 
123  XYZ  01-10-2013 1167 

現在要求與2014年1月相同,需要支付多少分期付款,什麼是Recd金額,在1月14日支付的餘額是多少。

預期輸出

SID  Sname Total Inst.Amt as on01.01.2014 Paid.amount  Balance amt  Balance.Installments 

123  XYZ  10500       9335   1165   1 

僅供參考我給一個學生數據。

該存儲過程應運行36000名學生。

+1

請發表你已經嘗試 –

+1

尼斯家庭作業!你爲什麼不與我們分享你迄今爲止的嘗試? – gvee

+2

「Balance.Installments」列代表什麼?在你的例子中它有'1'。你是如何達到樣本學生的這個價值的? – Shiva

回答

1

這裏有一個查詢會給你你想要的東西,希望Balance.Installments我不知道這意味着什麼:

SELECT distinct t1.SID 
, t1.SNAME 
, t1.Total_Inst 
, t2.Paid_amount AS 'Paid.Amount' 
, t1.Total_Inst - t2.Paid_amount as 'Balance amt' 
, CEILING((t1.Total_Inst - t2.Paid_amount)/t.Amount) as 'Balance.Installments' 
FROM 
    table_1 as t 
    JOIN 
    (SELECT SID, SNAME, SUM(Amount) as Total_Inst 
     FROM table_1 
     WHERE Date < STR_TO_DATE('01/01/2014', '%m/%d/%Y') group by SID, SNAME 
    ) 
    ON (t1.SID = t.SID AND t1.SNAME = t.SNAME) 
    AS t1 
    LEFT JOIN 
    (SELECT SID, SNAME, SUM(Amount) as Paid_amount 
     FROM table_2 
     WHERE Paydate < STR_TO_DATE('01/01/2014', '%m/%d/%Y') group by SID, SNAME 
    ) AS t2 
    ON (t1.SID = t2.SID AND t1.SNAME = t2.SNAME) 
+1

你的'JOIN'應該是'LEFT JOIN',這樣對於沒有付款的學生,您仍然可以顯示分期付款和到期餘額(這將是全額)。 – Shiva

+0

是的,你是對的。 –

+0

+1爲解決問題立即行動! – Shiva

0

爲什麼你需要在一個time.Also 36000運行記錄是什麼actially安裝。對於任何學生只有一個分期付款沒有幾個。所以我認爲數據庫是錯誤的。 表中每個學生只能有一筆分期金額和時間間隔(截止日期)。

檢查最新的變化。它只適用於一個學生。

Declare @student table(SID int,SNAME varchar(50),INST Date ,Amount int) 
insert into @student 
select 123,'XYZ','01-01-2013',3500 union all 
select 123, 'XYZ', '01-05-2013', 3500 union all 
select 123, 'XYZ', '01-10-2013', 3500 union all 
select 123, 'XYZ', '01-04-2014', 3500 union all 
select 123, 'XYZ', '01-06-2014', 3500 

Declare @instalmentamount float 
select @instalmentamount=amount from @student where sid=123 
--select @instalmentamount 
Declare @Table2 table(SID int,Paydate date,amoount int) 
insert into @Table2 
select 123, '01-01-2013', 1167 union all 
select 123, '01-02-2013', 1167 union all 
select 123, '01-03-2013', 1167 union all 
select 123, '01-05-2013', 1750 union all 
select 123, '01-05-2013', 1750 union all 
select 123, '01-10-2013', 1167 union all 
select 123, '01-10-2013', 1167 

declare @input date='01-01-2014' 

;With CTE as 
(select s.SID, sum(s.amount) as [Total Inst.Amt ] from @student s 
where s.INST<[email protected] 
group by s.SID), 
cte1 as 
(
select t.SID, sum(t.amoount) as [Paid.amount] from @Table2 t 
where t.Paydate<[email protected] 
group by t.SID 
) 

select c.sid, 
(select top 1 s.SNAME from @student s where s.SID=c.SID) [Name], 
c.[Total Inst.Amt ],c1.[Paid.amount], 
c.[Total Inst.Amt ]-c1.[Paid.amount] [BalanceAmount],cast(((c.[Total Inst.Amt ]-c1.[Paid.amount])/@instalmentamount) as int)+1 [Balance.Installments] 
from CTE c inner join cte1 c1 on c.SID=c1.SID 
+0

感謝您的答覆 – Narendra

+0

感謝您的答覆,其實我正在尋找平衡分期付款,我會盡量讓更好的理解,小前例:總分期付款額= 100,單分期付款= 50,支付40,餘額60,餘額分期= 2。因爲單一分期付款是50但餘額是60,它超過了一個分期付款,所以我們需要計算餘額分期爲2,希望這會幫助你 – Narendra

0

嘗試......

SELECT t.ID, 
     T.SNAME, 
     T.AMT 'Total Inst.Amt as on01.01.2014', 
     ISNULL(SUM(amoount),0) AS 'PAID AMT', 
     T.AMT - ISNULL(SUM(amoount),0) AS 'BALANCE AMT' ,  
     CEILING((T.AMT- ISNULL(SUM(amoount),0))/(T.InstAmt*1.)) 'Balance.Installments' 
FROM 
    (
    SELECT ID,SNAME,SUM(AMT)AMT,MAX(AMT) AS InstAmt FROM @Table1 WHERE DT_ < '01-31-2014' GROUP BY ID,SNAME 
    ) T 
    LEFT JOIN @Table2 P ON P.ID = T.id AND P.Paydate < '01-31-2014' 
GROUP BY t.ID,SNAME,t.InstAmt,T.AMT 
+0

感謝您的回覆,其實我正在尋找平衡分期付款,我會盡量做出更好的理解,小前例:總分期付款金額= 100,單一分期付款= 50,付款40,餘額60,餘額分期付款= 2。因爲單一分期付款是50但餘額是60,它超過一次分期付款,所以我們需要計算餘額分期爲2,希望這會幫助你 – Narendra

+0

我編輯了我的答案... – sureshhh