2015-03-31 28 views
0

我有一個表格式類似於下面,我們把它叫做「付款」如何獲得專欄的剩餘百分比?

P_ID | P_PayNum | P_AmtPerc | P_Type 
1 | 1  | 100  | FP1 
2 | 1  | 50  | 2P1 
3 | 2  | 50  | 2P1 
4 | 1  | 25  | 4P1 
5 | 2  | 0  | 4P1 
6 | 3  | 0  | 4P1 
7 | 4  | 0  | 4P1 

與我有,我想拿出最好的方式來創建一個工作表中的問題使用@TempTables更新腳本並插入以查找其中AmtPerc = 0的所有值,並找出如何獲取當前非0(本例中爲4P1類型的25),並找出3中剩餘的值爲0這將全部是25; 25 * 4 = 100)。

本表中有幾個條目,包括季度,半季度,半年度,雙月度等的付款計劃。這些相同的幾個也有一個問題,只有第一個部分百分比存在(第一次付款),其餘爲0.因此,我試圖找到動態查找所有0的最佳方式,找到代表該集合的第一筆付款,並將其更新爲總計達到100的正確百分比。

我老老實實不確定這更好的和充滿希望別人怎樣來寫明白我的意思。 如果有句話更好的方法或分析這個問題,然後隨意修改它更有意義,也許發現的代碼可以幫助別人,首先要弄清楚剩餘部分的百分比合計爲100

+0

對於P_Type = FP1,P_AmtPerc總是= 100,對於2P1是50,對於4P1是25。 – BWS 2015-03-31 20:53:33

+0

理想情況下,refcodes代表付款的類型。全額付款只需要一次付款,因此預計100%付款到期。 2P1兩筆款項,第一筆款項減少50%,餘下的50%在日後交付。等等:) – Doodely 2015-04-01 11:59:20

回答

1

聽起來像你不想計算缺少的付款百分比,而是要更新與他們的基表。在SQL Server中,你可以做到這方式:

UPDATE p 
SET p.P_AmtPerc = r.remaining_perc/r.num_zero 
FROM 
    payments p 
    INNER JOIN (
     SELECT 
     P_Type, 
     100 - SUM(P_AmtPerc) AS remaining_perc, 
     SUM(case P_AmtPerc when 0 then 1 else 0 end) as num_zero 
     FROM payments 
     GROUP BY P_Type 
     HAVING SUM(P_AmtPerc) < 100 
     AND SUM(case P_AmtPerc when 0 then 1 else 0 end) > 0 
    ) r 
    ON p.P_Type = r.P_Type 
WHERE p.P_AmtPerc = 0 

你會承認類似於迄今公佈的其他兩個答案提出的疑問線視圖。它針對每種支付類型計算剩餘的待分配百分比和支付行的數量,在該支付行中拆分它們,篩選出至少已經分配了(至少)100%支付或者沒有行的支付類型零付款指定。

查詢的其餘部分是專有的SQL Server語法,基本上是通過視圖更新表。它僅更新那些在內聯視圖中具有對應行的行P_AmtPerc = 0。特別是,如果存在付款類型,其記錄的付款合計至少爲100,但付款類型的付款額度爲零,則現在會更新該付款類型的行。它忽略了任何非零支付百分比,將支付餘額分成零支付,而不是使其與第一筆支付相匹配。

+0

自從我使用或看過HAVING子句以來,我已經有一段時間了。除了那些無關緊要的通知之外,我會說你的解決方案工作得非常好!我最終會選擇這個作爲當前情況的最佳答案,因爲它完全符合我的要求! :) 說真的,所有的答案都很棒,每個答案都可以讓我得到正確的答案,但是這個答案直接實現了我所期望的。 – Doodely 2015-04-01 12:10:10

1

我花了在我的麪條周圍包裹這一塊的時刻,你有不同的付款代碼(至少在這個例子中),但是當一個給定的代碼的所有付款都完成時,百分比應該等於100%。

你需要的是找到未支付的,其中至少一個已經付款,並找出還剩下多少付出。

Select AccountNumber --I imagine this will be replaced by an account PK or item PK 
    , 100 - sum(P_amtPerc) as RemainingPercent 
    , sum(case when P_amtPerc = 0 then 1 else 0 end) as RemainingPayments 
From Payments 
Group By AccountNumber --Once again this is a stand in for your real PK 
having sum(P_amtPerc) < 100 

這樣做是什麼我們用一組語句,使我們能夠彙總表的其餘部分,在這種情況下,我們想看看有多少款項尚未到來,並留下多大比例。我們使用having條款來過濾完全支付的賬戶(例如:100%),所以我們確信我們只查看未付款或部分付款的賬戶。希望這對你來說是正確的。

1

是這樣的嗎?

create table #temp (P_ID int, P_PayNum int, P_AmtPerc int, P_Type nvarchar(5)); 
insert into #temp values (1,1,100,'FP1'); 
insert into #temp values (2,1,50,'2P1');      
insert into #temp values (3,2,50,'2P1'); 
insert into #temp values (4,1,25,'4P1'); 
insert into #temp values (5,2,0,'4P1'); 
insert into #temp values (6,3,0,'4P1'); 
insert into #temp values (7,4,0,'4P1'); 

select A.P_ID 
     ,A.P_PayNum 
     ,A.P_AmtPerc 
     ,A.P_Type 
     ,case when T1.cntpct = 0 or A.P_AmtPerc > 0 then 0 else (100-T1.sumpct)/T1.cntpct end as Remainder 
from #temp as A 
join (select P_Type 
       ,sum(P_AmtPerc) as sumpct 
       ,sum(case when P_AmtPerc = 0 then 1 else 0 end) as cntpct 
from #temp 
group by P_Type) as T1 on 
T1.P_Type = A.P_Type; 
drop table #temp; 
+0

雖然不是所選的答案,但這仍然是一個很好的答案!我可能會使用一些關於連接和臨時設置的技術來進行未來任務:)謝謝 – Doodely 2015-04-01 12:11:36