创建列并加载数据

时间:2016-07-22 22:40:39

标签: sql-server tsql

我想为自己做一些个人财务分析,为了更好地理解SQL的编程元素,我真的想在SQL Server中使用存储过程(与纯Excel相比)。关于我想要传递的变量,我有几个想法,但我需要一些建议。也许我正在过度思考它,但我对如何创建一个初始列具有从用户当前年龄到60的值感到困惑(参见下面的示例)。所以sproc会接受一个变量,即用户的年龄。在生成表格的那一部分之后,我想要包括诸如储蓄和退休之类的列,其中我将根据年龄有一些基本方程式来说明这些帐户将如何增长。我真的不知道从哪里开始,我真的很感激任何建议。我应该使用哪些命令?临时表?循环?

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

2 个答案:

答案 0 :(得分:0)

那么,

这个问题非常模糊,基于意见,但我没有处理这类事情的声誉:P。

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

我建议创建一个不处理实际美元的计算表,而是一系列具有多行因子的列,这些因子将与输入数据相乘。假设您的输入是age和savings_at_certain_age ......那么您可以通过编程方式将这些数字与计算表中的正确耦合字段相乘以生成输出...

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

答案 1 :(得分:0)

好的,我花了一些时间研究这个并找到了适合我的解决方案。我还有一些工作要做,以引起复利。

CREATE PROCEDURE [dbo].[personalfinanceTest]
    @Input_AgeCurrent               INT
    ,@Input_AgeRetire               INT
    ,@Input_Income                  DECIMAL(10,2)
    ,@Input_IncomeIncreasePct       DECIMAL(10,6)
    --@PostTaxSalarySavingsPct 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
    --@Inflation decimal(10,2),
    --@SavingsInterest 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;