我想为自己做一些个人财务分析,为了更好地理解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
答案 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;