表一,名是A。主键ACKDT+FUNDID+SEATNO
字段名称 字段类型 中文说明
ACKDT VARCHAR2(8) 确认日期
FUNDID VARCHAR2(6) 基金代码
OPFUNDID VARCHAR2(6) 对方基金代码
SEATNO VARCHAR2(6) 销售商代码
ZC_FEE NUMBER 转出手续费
ZR_FEE NUMBER(16,2) 转入手续费
ZHBC_FEE NUMBER(16,2) 补差费
表二,名是B。主键ACKDT+FUNDID+SEATNO
字段名称 字段类型 中文说明
ACKDT VARCHAR2(8) 确认日期
FUNDID VARCHAR2(6) 基金代码
SEATNO VARCHAR2(6) 销售商代码
SH_FEE NUMBER 赎回手续费
SH_HDSGF NUMBER(16,2) 后端申购费
SG_FEE NUMBER(16,2) 申购手续费
FYWLX VARCHAR2(1) 业务类型,只有认申购业务才需要填写,0代表认购,1代表申购
问题:4. 查询所有基金所有销售机构每一年对应的赎回手续费、申购手续费以及上年赎回手续费和申购手续费汇总
查询结果示例:
年份 赎回手续费 申购手续费 上期赎回手续费 上期申购手续费
2001 30 10 20 10
2002 30 10 30 10
2003 30 10 30 10
提示:可以使用视图、多段查询实现
问题5. 要求基于表A,编写SQL语句查询20061231对应的上一工作日日期。
查询结果示例:
日期 上一工作日
20061231 20061229

Oracle 几个问题求解。。。help啦。
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- 你知我知皆知 2024-08-02 09:38关注
以下回答参考 皆我百晓生、券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。
要解决这些问题,我们可以分步骤来实现:
问题1: 查询所有基金的销售机构和每年对应的赎回手续费、申购手续费及上期数据
首先,我们需要创建一个视图
view_fees
来存储所需信息,并使用多段查询进行计算。这里我们假设ACKDT
是确认日期字段。CREATE VIEW view_fees AS SELECT A.ACKDT, A.FUNDID, B.SH_FEE AS sh_fee, B.SG_FEE AS sg_fee, (CASE WHEN B.FYWLX = '1' THEN B.SG_FEE ELSE NULL END) AS last_year_sg_fee, (CASE WHEN B.FYWLX = '1' THEN B.SH_FEE ELSE NULL END) AS last_year_sh_fee, SUM(B.ZC_FEE) OVER (PARTITION BY A.FUNDID ORDER BY A.ACKDT) as total_zc_fee, SUM(B.ZR_FEE) OVER (PARTITION BY A.FUNDID ORDER BY A.ACKDT) as total_zr_fee, SUM(B.ZHBC_FEE) OVER (PARTITION BY A.FUNDID ORDER BY A.ACKDT) as total_zhbc_fee FROM A JOIN B ON A.ACKDT = B.ACKDT AND A.FUNDID = B.FUNDID WHERE A.ACKDT BETWEEN TO_DATE('2005-12-31', 'YYYY-MM-DD') AND TO_DATE('2007-12-31', 'YYYY-MM-DD') GROUP BY A.ACKDT, A.FUNDID;
这个查询将根据
A.ACKDT
和A.FUNDID
的组合对每个基金进行分区并计算SH_FEE
,SG_FEE
,ZC_FEE
,ZR_FEE
,ZHBC_FEE
。然后,它会聚合这些值以获取总费用。问题2: 查询2006年12月31日对应的上一工作日日期
这可以通过在
view_fees
视图中添加一个新的列来完成,例如last_workday_date
。ALTER TABLE view_fees ADD COLUMN last_workday_date DATE; UPDATE view_fees SET last_workday_date = DATEADD(DAY, -1, last_workday_date);
现在,你可以通过以下 SQL 查询获取2006年12月31日的上一工作日日期:
SELECT A.ACKDT, A.FUNDID, last_workday_date FROM view_fees A LEFT JOIN ( SELECT last_workday_date FROM view_fees WHERE A.ACKDT = '2006-12-31' ) B ON A.ACKDT = B.last_workday_date ORDER BY A.ACKDT, A.FUNDID;
这个查询首先从
view_fees
视图中选择last_workday_date
列,然后将其与原始视图中的A.ACKDT
和A.FUNDID
进行连接。最后,它仅返回那些匹配2006-12-31
的记录,从而得到2006年12月31日的上一工作日日期。结合两个查询的完整代码:
-- 创建视图 view_fees CREATE VIEW view_fees AS SELECT A.ACKDT, A.FUNDID, B.SH_FEE AS sh_fee, B.SG_FEE AS sg_fee, (CASE WHEN B.FYWLX = '1' THEN B.SG_FEE ELSE NULL END) AS last_year_sg_fee, (CASE WHEN B.FYWLX = '1' THEN B.SH_FEE ELSE NULL END) AS last_year_sh_fee, SUM(B.ZC_FEE) OVER (PARTITION BY A.FUNDID ORDER BY A.ACKDT) as total_zc_fee, SUM(B.ZR_FEE) OVER (PARTITION BY A.FUNDID ORDER BY A.ACKDT) as total_zr_fee, SUM(B.ZHBC_FEE) OVER (PARTITION BY A.FUNDID ORDER BY A.ACKDT) as total_zhbc_fee FROM A JOIN B ON A.ACKDT = B.ACKDT AND A.FUNDID = B.FUNDID WHERE A.ACKDT BETWEEN TO_DATE('2005-12-31', 'YYYY-MM-DD') AND TO_DATE('2007-12-31', 'YYYY-MM-DD') GROUP BY A.ACKDT, A.FUNDID; -- 添加新的上一工作日列 ALTER TABLE view_fees ADD COLUMN last_workday_date DATE; -- 更新 last_workday_date 到前一天 UPDATE view_fees SET last_workday_date = DATEADD(DAY, -1, last_workday_date); -- 查询2006年12月31日的上一工作日日期 SELECT A.ACKDT, A.FUNDID, last_workday_date FROM view_fees A LEFT JOIN ( SELECT last_workday_date FROM view_fees WHERE A.ACKDT = '2006-12-31' ) B ON A.ACKDT = B.last_workday_date ORDER BY A.ACKDT, A.FUNDID;
以上就是如何解决问题的方法。请注意,上述代码可能需要根据实际数据库结构进行调整。
解决 无用评论 打赏 举报