码迷,mamicode.com
首页 > 数据库 > 详细

一个简单有趣的SQL存储过程——个人财务管理

时间:2016-08-19 12:50:10      阅读:428      评论:0      收藏:0      [点我收藏+]

标签:

刚开始学习存储过程的小白,网上看完语法后一般都会想实践一下,但往往又不知道该写个什么样的存储过程来练手,以下就提供一个简单有趣、用来查询每月个人财务状况的存储过程。

一、建表

首先需要建一张事实表,用来记录每月重要的支出,包括支出的类型、费用、付款方式、每月付款时间、首次分期还贷时间、最后分期还贷时间(还完的时间)、用途、支出大类。。。不一定会都用到,也可以根据实际情况做相应的增减,以下仅提供一个例子。

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月份个人财务情况

技术分享

一个简单有趣的SQL存储过程——个人财务管理

标签:

原文地址:http://www.cnblogs.com/TurboWay/p/5786634.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!