标签:
刚开始学习存储过程的小白,网上看完语法后一般都会想实践一下,但往往又不知道该写个什么样的存储过程来练手,以下就提供一个简单有趣、用来查询每月个人财务状况的存储过程。
一、建表
首先需要建一张事实表,用来记录每月重要的支出,包括支出的类型、费用、付款方式、每月付款时间、首次分期还贷时间、最后分期还贷时间(还完的时间)、用途、支出大类。。。不一定会都用到,也可以根据实际情况做相应的增减,以下仅提供一个例子。
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