标签:
刚开始学习存储过程的小白,网上看完语法后一般都会想实践一下,但往往又不知道该写个什么样的存储过程来练手,以下就提供一个简单有趣、用来查询每月个人财务状况的存储过程。
一、建表
首先需要建一张事实表,用来记录每月重要的支出,包括支出的类型、费用、付款方式、每月付款时间、首次分期还贷时间、最后分期还贷时间(还完的时间)、用途、支出大类。。。不一定会都用到,也可以根据实际情况做相应的增减,以下仅提供一个例子。
CREATE TABLE [dbo].[Fact_CostType] ( [CostTypeID] [nvarchar](50) NOT NULL , --支出的类型 [Cost] [numeric](18, 2) NULL , --费用 [PayType] [nvarchar](50) NULL , --付款方式 [RefunDate] [nvarchar](50) NULL , --每月付款时间 [StartDate] [int] NULL , --首次分期还贷时间 [EndDate] [int] NULL , --最后分期还贷时间(预期还完的时间) [UseType] [nvarchar](50) NULL , --用途 [BigType] [nvarchar](50) NULL , --支出大类(固定支出or临时支出) PRIMARY KEY CLUSTERED ( [CostTypeID] ASC ) WITH ( PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON ) ON [PRIMARY] ) ON [PRIMARY] GO
下面是演示的输出图
二、写存储过程
CREATE PROC [dbo].[Cost] ( @YearMonth NVARCHAR(50) , --必填:查询的月份 输入格式为 年月,例:201608 @Profit INT = 0 , --选填:上月结余金额,根据实际情况设值,默认为0 @Salary INT = 3000, --选填:每月薪水收入,建议填上扣除五险一金以及个税后的实际金额,Demo以实际薪水收入3000为例 -- 1,每月收入固定,则可以在存储过程中写死 -- 2,每月收入不固定,则可以在执行存储过程时,输入当月的实际收入 @HousingFund INT = 1800 --选填:公积金,如果有办按季提取,根据实际情况设值;没办设0;Demo以公积金一月600,按季提取为例 ) AS CREATE TABLE #CostTable ( [CostTypeID] [nvarchar](50) , [Cost] [numeric](18, 2) , [PayType] [nvarchar](50) , [RefunDate] [nvarchar](50) , [StartDate] [int] , [EndDate] [int] , [UseType] [nvarchar](50) , [BigType] [nvarchar](50) ) INSERT INTO #CostTable SELECT * FROM [Way].[dbo].[Fact_CostType] WHERE PayType IN ( ‘按月‘, ‘按次‘ ) IF RIGHT(@YearMonth, 2) IN ( ‘01‘, ‘04‘, ‘07‘, ‘10‘ ) BEGIN INSERT INTO #CostTable SELECT [CostTypeID] , [Cost] , [PayType] , [RefunDate] , REPLACE([StartDate], ‘210001‘, @YearMonth) , REPLACE([EndDate], ‘210001‘, @YearMonth) , [UseType] , [BigType] FROM [Way].[dbo].[Fact_CostType] WHERE PayType IN ( ‘按季‘ ) SET @Salary = @Salary + @HousingFund END SELECT @YearMonth AS 月份 , SUM(Cost) AS 合计支出金额 FROM #CostTable WHERE LEFT(CONVERT(NVARCHAR(8), EndDate, 112), 6) >= @YearMonth AND LEFT(CONVERT(NVARCHAR(8), StartDate, 112), 6) <= @YearMonth SELECT [BigType] AS 大类 , SUM(Cost) AS 支出金额 FROM #CostTable WHERE LEFT(CONVERT(NVARCHAR(8), EndDate, 112), 6) >= @YearMonth AND LEFT(CONVERT(NVARCHAR(8), StartDate, 112), 6) <= @YearMonth GROUP BY bigtype SELECT [BigType] AS 大类 , [CostTypeID] AS 项目 , [Cost] AS 支出明细 , [UseType] AS 用途 FROM #CostTable WHERE LEFT(CONVERT(NVARCHAR(8), EndDate, 112), 6) >= @YearMonth AND LEFT(CONVERT(NVARCHAR(8), StartDate, 112), 6) <= @YearMonth DECLARE @cost INT SELECT @cost = SUM(Cost) FROM #CostTable WHERE LEFT(CONVERT(NVARCHAR(8), EndDate, 112), 6) >= @YearMonth AND LEFT(CONVERT(NVARCHAR(8), StartDate, 112), 6) <= @YearMonth SET @Profit = @Profit + @Salary - @cost IF ( @Profit < 0 ) BEGIN SELECT @Salary - @cost AS ‘银子不够花,就该想想怎么挣钱,你这个Loser !!!‘ END IF ( @Profit >= 500 ) BEGIN SELECT @Salary - @cost AS ‘很好,你这个守财奴 !!!‘ END IF ( @Profit > 0 AND @Profit < 500 ) BEGIN SELECT @Salary - @cost AS ‘又混过去一个月了,你这个月光族 !!!‘ END
三、运行存储过程
1,UI执行
2,语句执行
DECLARE @return_value INT EXEC @return_value = [dbo].[Cost] @YearMonth = N‘201608‘ --, @Profit = 0 --, @Salary = 0 --, @HousingFund = 0 GO
四、执行结果
2016年7月份个人财务情况
2016年8月份个人财务情况
标签:
原文地址:http://www.cnblogs.com/TurboWay/p/5786634.html