SQL帮助 - 计算记录一次

时间:2017-02-10 14:19:37

标签: sql sql-server tsql sql-server-2012

我需要计算借款人总数(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美元。

4 个答案:

答案 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_idcnsmr_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%以上。