我需要计算借款人总数(cnsmr_accnt.cnsmr_id)以及每年借款人的本金和利息余额总和。我的下面的代码实现了这一点,但我需要计算每个借款人所有年份的一次(第一年)。
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美元。
答案 0 :(得分: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)
答案 1 :(得分:0)
您只需要将DISTINCT与COUNT一起使用:
COUNT(DISTINCT cnsmr_accnt.cnsmr_id) AS [Borrower Count],
答案 2 :(得分:0)
因此,借款人cnsmr_id
在cnsmr_accnt
中拥有多个帐户。你想要总和和第一年 per 借款人。因此,您必须分组 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;
答案 3 :(得分:-1)
不要使用嵌套查询。用户3083310建议使用count(*)over(Partition by。你的性能将比嵌套查询好80%以上。