--启示:现实实际中,很多项目都有这种表,比如消费支出表,记录一种变化的量,求出阶段累计的量
第一个问题--客户要求出某个客户阶段区间每只基金的收益,
--备注:一张主表是记录客户不同时间,各种买入卖出操作详情表,记录的是变化的份额,赎回,分红,
--思路:第一步:先求出起始日期点之前的累计份额,根据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