基金管理系统中,在数据库sql server中,利用case when then 配合sum,isnull等语句,从变化记录表中求出阶段区间收益,归纳总结

--启示:现实实际中,很多项目都有这种表,比如消费支出表,记录一种变化的量,求出阶段累计的量

第一个问题--客户要求出某个客户阶段区间每只基金的收益,

--备注:一张主表是记录客户不同时间,各种买入卖出操作详情表,记录的是变化的份额,赎回,分红,
        
--思路:第一步:先求出起始日期点之前的累计份额,根据select sum(case when then) 计算复杂的合并操作
            --用法demo
         

   select a.FundAccount ,a.FundCode, 
            --不能对包含子查询的语句,或包含聚合的表达式,进行聚合函数,需要单独加上select
            --(select 
                sum(
                isnull(
                CASE when (TradeType='认购' or TradeType='申购' or TradeType='定投'
                 or TradeType='拆分' or TradeType='分红再投资'
                 or TradeType='转托管转入'or TradeType='非交易过户转入' 
                    or  TradeType='强增'or TradeType='基金转换的记帐')
                     and tradedate<'2018-01-01' then lot 
               when (TradeType='赎回' or TradeType='强减' 
                    or TradeType='转托管转出' or TradeType='非交易过户转出'
                 or TradeType='基金转换') and tradedate<'2018-01-01'then 0-lot end,0)
                 )--先求出份额总和,
                *isnull((select top 1 dwjz  from jjjzcz where bzdm=a.FundCode and fsrq<='2018-01-01' order by fsrq desc),1)
                --)放在这里会出错,不能包含子查询
    
            --)期初市值
                from WFT_CustomerFundTradeDetails a where FundAccount='454821000386630' group by a.FundAccount,a.FundCode

--        功能相当于js中each()操作,a.lot是份额增加的情况,0-lot则是份额减少的各种情况

--        第二步:根据一个子查询求出另外一张副表中单位净值,算出起始时间点期初市值,

--        同理算出期末市值,以及赎回,分红


第二个问题
---求出下面一张表格在一段时间内,最大最小复权价,七日年化收益,单位净值,累计净值

CREATE TABLE [dbo].[JJJZCZ](
    [GUID] [varchar](38) NOT NULL,
    
    [JJDM] [char](6) NOT NULL,
    [Dwjz] [decimal](19, 4) NULL,
    [Ljjz] [decimal](19, 4) NULL,
    [FSRQ] [date] NOT NULL,
    [ZHXGRQ] [datetime] NULL,
    [SCBZ] [tinyint] NULL,
    [GKBZ] [tinyint] NULL,
    [CZY] [varchar](12) NULL,
    [WFDWSY] [decimal](19, 4) NULL,
    [NSYL] [decimal](19, 4) NULL,
    [fuquanjia] [decimal](18, 8) NULL,
    [dayyield] [decimal](18, 4) NULL,
    [fbfuquanjia] [decimal](18, 8) NULL,
    [bzdm] [char](6) NULL,
 CONSTRAINT [PK_JJJZCZ] PRIMARY KEY CLUSTERED 
(
    [JJDM] ASC,
    [FSRQ] DESC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

--备注:记录的是在发生日期下每只基金双主键 ,万份单位收益WFDWSY,七日年化收益NSYL(根据七日平均算出的年收益)
--        前复权价 后复权价 日收益(等同于货币基金万份单位收益)

--思路

--第一步:先根据基金分组,求出每只基金在这段时间内最小,最大发生日期,形成一张表格temp
--第二步:根据这个temp,和自身进行并联查询出来,最小日期下各个对应值,
--        再并联最大日期下,各个字段对应值

--写法如下,

select a.bzdm,minfsrq,maxfsrq,b.Dwjz mindwjz,b.Ljjz minljjz,b.fbfuquanjia minfuquanjia,c.Dwjz maxdwjz,c.Ljjz maxljjz,c.fbfuquanjia maxfuquanjia from 
        (
        select bzdm,min(fsrq) minfsrq,MAX(fsrq) maxfsrq from jjjzcz where fsrq between '2018-01-30' and '2018-12-30'  group by bzdm
        ) a left join JJJZCZ b on a.bzdm=b.bzdm and a.minfsrq=b.FSRQ left join JJJZCZ c on a.bzdm=c.bzdm and a.maxfsrq=c.FSRQ


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值