2016-07-22 57 views
0

我想为自己做一些个人财务分析,我真的想在存储过程(vs纯粹的Excel)中的SQL Server中执行它,以便更好地理解SQL的编程元素。我想了解我想要传递哪些变量的几个想法,但我需要一些关于结构的建议。也许我正在推翻它,但我对如何创建一个具有用户当前年龄的值为60的初始列感到困惑(请参见下面的示例)。因此,该sproc将采取一个变量,这是用户的年龄。在表格的那一部分生成之后,我想包括像Savings and Retirement这样的列,在这里我将有一些基础方程式来说明这些账户如何根据年龄增长。我不知道从哪里开始,我非常感谢任何建议。我应该使用哪些命令?临时表? while循环?创建列和加载数据

Years Age Savings Retirement 
1  21  10,000   6,000 
2  22  15,000  13,000 
3  23  21,000  20,000 
4  24  28,000  30,000 
5  25  36,000  42,000 
... ...  ...   ... 
40  60 300,000  500,000 
+0

所有+1首先确定使用存储过程。你在正确的轨道上。这是我学习SQLServer的方式,除了我使用了体育统计数据。恕我直言,SQL Server中最重要的一件事就是SQL语言以及根据集合而不是行来思考的能力。一旦你掌握了它,其他一切都会变得更简单。但对于你的情况,我建议你选择你想要做的一些共同的财务计算,并开始玩它并在SQL Server中实现它。 – objectNotFound

+0

大多数想要实现的内容都可以使用Select语句来完成,除非情况很复杂并且需要除select以外的结构和功能。我建议你先尝试理解连接的概念并实现一些基本的场景。有很多可用的帮助。祝你好运。 – objectNotFound

+0

嗨,谢谢你的反馈。我主要尝试创建“年份和年龄”列,然后在选择语句中执行财务计算。所以它看起来像这样:SELECT Years,Age,@Income * 1.05^[Years] AS Savings FROM [YearsAgeTable]。我想[YearsAgeTable]是动态的,所以它始于Age变量。 – Walker

回答

0

好的,我花了一些时间在这方面进行研究,并找到了适用于我的解决方案。我还有一些工作要做,以引起复利兴趣。

CREATE PROCEDURE [dbo].[personalfinanceTest] 
    @Input_AgeCurrent    INT 
    ,@Input_AgeRetire    INT 
    ,@Input_Income     DECIMAL(10,2) 
    ,@Input_IncomeIncreasePct  DECIMAL(10,6) 
    [email protected] decimal(10,2), 
    ----Investment 
    ,@Input_401k_PersonalPct  DECIMAL(10,2) 
    ,@Input_401k_EmployerPct  DECIMAL(10,2) 
    ,@Input_IRA_TradAmt    DECIMAL(10,2) 
    ,@Input_IRA_RothAmt    DECIMAL(10,2) 
    ----Market 
    [email protected] decimal(10,2), 
    [email protected] decimal(10,2) 
AS 


CREATE TABLE #Table 
    ([Age]       INT    NOT NULL 
    ,[Years]      INT    NULL 
    ,[Income]      DECIMAL(10,2) NULL 
    ,[401k Personal]    DECIMAL(10,2) NULL 
    ,[IRA Traditional]    DECIMAL(10,2) NULL 
    ,[Taxable Income]    DECIMAL(10,2) NULL 
    ,[Tax]       DECIMAL(10,2) NULL 
    ,[PostTax Income]    DECIMAL(10,2) NULL 
    ,[Savings]      DECIMAL(10,2) NULL 
    ,[401k Employer]    DECIMAL(10,2) NULL 
    ,[401k Total]     DECIMAL(10,2) NULL 
    ,[IRA Roth]     DECIMAL(10,2) NULL 
    ,[IRA Total]     DECIMAL(10,2) NULL 
    ,[Cumulative Savings]   DECIMAL(10,2) NULL 
    ,[Cumulative Retirement]  DECIMAL(10,2) NULL 
    ) 

DECLARE @age      INT    = @Input_AgeCurrent 
DECLARE @prev_savings    DECIMAL(10,2) = 0 
DECLARE @prev_retirement   DECIMAL(10,2) = 0 


WHILE @age <= @Input_AgeRetire 
    BEGIN 
     DECLARE @years    INT    = @age - @Input_AgeCurrent 
     DECLARE @income    DECIMAL(10,2) = @Input_Income * POWER(@Input_IncomeIncreasePct + 1,@years) 
     DECLARE @401k_personal  DECIMAL(10,2) = @Input_401k_PersonalPct * @income 
     DECLARE @401k_employer  DECIMAL(10,2) = @Input_401k_EmployerPct * @income 
     DECLARE @tax    DECIMAL(10,2) = dbo.calculateTax(@income - @401k_personal) 
     DECLARE @IRA_trad   DECIMAL(10,2) = @Input_IRA_TradAmt 
     DECLARE @IRA_roth   DECIMAL(10,2) = @Input_IRA_RothAmt 

     DECLARE @income_taxable  DECIMAL(10,2) = @income - @401k_personal 
     DECLARE @income_posttax  DECIMAL(10,2) = @income - @tax 
     DECLARE @401kTotal   DECIMAL(10,2) = @401k_personal + @401k_employer 
     DECLARE @IRATotal   DECIMAL(10,2) = @IRA_trad + @IRA_roth 

     DECLARE @retirement   DECIMAL(10,2) = @401kTotal + @IRATotal 
     DECLARE @savings   DECIMAL(10,2) = @income_posttax - @retirement 

     INSERT INTO #Table([Age] 
        ,[Years] 
        ,[Income] 
        ,[401k Personal] 
        ,[IRA Traditional] 
        ,[Taxable Income] 
        ,[Tax] 
        ,[PostTax Income] 
        ,[Savings] 
        ,[401k Employer] 
        ,[401k Total] 
        ,[IRA Roth] 
        ,[IRA Total] 
        ,[Cumulative Savings] 
        ,[Cumulative Retirement]) 
     SELECT @age 
      ,@years 
      ,@income 
      ,@401k_personal 
      ,@IRA_trad 
      ,@income_taxable 
      ,@tax 
      ,@income_posttax 
      ,@savings 
      ,@401k_employer 
      ,@401kTotal 
      ,@IRA_roth 
      ,@IRATotal 
      ,@prev_savings + @savings 
      ,@prev_retirement + @retirement 


     SET @age += 1 
     SET @prev_savings += @savings 
     SET @prev_retirement += @retirement 
    END 

SELECT * 
FROM #Table 

此外,我创建了一个功能,2016年的税收等级:

CREATE FUNCTION [dbo].[calculateTax] (@salary AS money) 

RETURNS money 
AS 

BEGIN 
    DECLARE @tax money 
    DECLARE @10high money = 9275 
     ,@15low  money = 9276 
     ,@15high money = 37650 
     ,@25low  money = 37651 
     ,@25high money = 91150 
     ,@28low  money = 91151 
     ,@28high money = 190150 
     ,@33low  money = 190151 
     ,@33high money = 413350 
     ,@35low  money = 413351 

    IF   @salary < @10high SET @tax = @salary * 0.1 
     ELSE IF @salary < @15high SET @tax = @10high * 0.1 + (@salary - @15low)*0.15 
     ELSE IF @salary < @25high SET @tax = @10high * 0.1 + (@15high - @15low)*0.15 + (@salary - @25low)*0.25 
     ELSE      SET @tax = @10high * 0.1 + (@15high - @15low)*0.15 + (@25high - @25low)*0.25 + (@salary - @35low)*0.35 


     RETURN @tax 
    END; 
0

好,

这个问题是相当模糊和意见为主,但我没有信誉来处理这样的事情:P。

听起来像一个很棒的项目。

我建议创建一个不涉及真实美元的计算表,而是一系列具有多行因子的列,这些因子将与您的输入数据相乘。说你的输入是age和savings_at_certain_age ...那么你可以通过编程将这些数字乘以计算表中的正确的偶数字段以产生输出...

您将需要编写一个存储过程 - 这是一个完全不同的主题 - 但是适合您的问题的功能。在追求问题时寻找临时变量,临时表和存储过程。