卡卡JW 2014-07-28 09:20 采纳率: 0%
浏览 1030

Oracle 几个问题求解。。。help啦。

表一,名是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

  • 写回答

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.ACKDTA.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.ACKDTA.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;
    

    以上就是如何解决问题的方法。请注意,上述代码可能需要根据实际数据库结构进行调整。

    评论

报告相同问题?