2017-02-10 39 views
0

我需要计算每年借款人总数(cnsmr_accnt.cnsmr_id)以及这些借用人每年的总本息余额。我的下面的代码完成了这一点,但我需要统计每个借款人只有一次(第一年)在所有年份。SQL帮助 - 一次计算记录

SELECT DISTINCT  
MIN(DATEPART(YEAR, UDEFDebtInfo.UDEFDebtPlacementDt)) AS [First Placement Year], 
COUNT(cnsmr_accnt.cnsmr_id) AS [Borrower Count], 
SUM(UDEFDebtInfo.UDEFDebtOrigPrincBal) AS [Principal Balance], 
SUM(UDEFDebtInfo.UDEFDebtOrigIntBal) AS [Int Balance] 
FROM UDEFDebtInfo 
INNER JOIN cnsmr_accnt ON UDEFDebtInfo.cnsmr_accnt_id = cnsmr_accnt.cnsmr_accnt_id 
GROUP BY DATEPART(YEAR, UDEFDebtInfo.UDEFDebtPlacementDt) 

例如,如果借款人在2008年有一个UDEFDebtPlacementDt $ 500一本金余额及$ 100,UDEFDebtPlacementDt 2009年利息余额$ 1,000本金余额和$ 200之间利益平衡,则借款人应仅在2008年计算,本金余额为1,500美元,利息余额为300美元。

+1

查看OVER子句中的文档。我认为这可能是你的答案。您还需要PARTITION部分。 – SteveB

+0

COUNT(DISTINCT cnsmr_accnt.cnsmr_id)也许? – dean

+0

如果您添加了脚本来创建所需的数据,那么对于某人来说,帮助会更容易。以及预期的产出。迪恩可能是对的,你需要的只是伯爵的不同之处。 – SteveB

回答

0

所以借款人cnsmr_id谁在cnsmr_accnt有几个账户。你想要的数额和第一年借款人。所以,你必须通过cnsmr_id组。

一旦你有了这个数据,你要聚集年,所以你组由年然后。

SELECT 
    first_placemant_year AS [First Placement Year], 
    COUNT(*) AS [Borrower Count], 
    SUM(principal_balance) AS [Principal Balance], 
    SUM(int_balance) AS [Int Balance] 
FROM 
(
    SELECT 
    ca.cnsmr_id, 
    MIN(DATEPART(YEAR, di.UDEFDebtPlacementDt)) AS first_placemant_year, 
    SUM(di.UDEFDebtOrigPrincBal) AS principal_balance, 
    SUM(di.UDEFDebtOrigIntBal) AS int_balance 
    FROM UDEFDebtInfo di 
    INNER JOIN cnsmr_accnt ca ON di.cnsmr_accnt_id = ca.cnsmr_accnt_id 
    GROUP BY ca.cnsmr_id 
) borrowers 
GROUP BY first_placemant_year 
ORDER BY first_placemant_year; 
+0

真棒,谢谢 – user3641053

0

select中的嵌套查询应该工作。对于校长,你可以试试下面的查询,并添加兴趣相同的方式

SELECT DISTINCT  
MIN(DATEPART(YEAR, UDEFDebtInfo.UDEFDebtPlacementDt)) AS [First Placement Year] 
, COUNT(cnsmr_accnt.cnsmr_id) AS [Borrower Count] 
, (SELECT SUM(UDEFDebtInfo.UDEFDebtOrigPrincBal) FROM UDEFDebtInfo u WHERE u.cnsmr_accnt_id=UDEFDebtInfo.cnsmr_accnt_id) AS [Principal Balance] 
FROM UDEFDebtInfo 
INNER JOIN cnsmr_accnt ON UDEFDebtInfo.cnsmr_accnt_id = cnsmr_accnt.cnsmr_accnt_id 
GROUP BY DATEPART(YEAR, UDEFDebtInfo.UDEFDebtPlacementDt) 
0

你只需要使用DISTINCT与COUNT:

COUNT(DISTINCT cnsmr_accnt.cnsmr_id) AS [Borrower Count], 
-1

不要使用嵌套查询。由于用户3083310建议的。使用过(分区计数(*)你的表现将超过80%更好,然后嵌套查询。