序号 字段名称 类型 字段描述
1 FDate DATE 日期
3 FZqdm Varchar2(10) 证券代码
4 FSzsh Varchar2(1) 深圳上海
5 FJyxwh Varchar2(10) 交易席位号
6 FBje double 买金额
8 FBsl double 买数量
10 Fbyj double 买佣金
12 FBjsf double 买经手费
14 FByhs double 买印花税
18 FBghf double 买过户费
23 Fbsfje double 买实付金额SQL需求:
         符合“当日买入平均价相比5日前买入平均价高5%或低5%”的股票,这些股票5日总成交金额占这5日全部成交股票的比例。
         说明:
买入平均价= FBje/FBsl
        日期:FDate
        每日成交金额:FBje
                 全部股票成交:所有股票的FBje合计

解决方案 »

  1.   

    假设日期是连续(实际交易日不会是连续的),不知道你这里是每天的汇总数据,还是每天的明细数据,我按明细数据库来做/* Formatted on 2008/05/12 21:00 (Formatter Plus v4.8.8) */
    SELECT bbb.*
      FROM (SELECT aa.fzqdm
              FROM (SELECT TRUNC (fdate), fzqdm,
                           sum(fbje) / SUM (fbsl) avg_price,
                           LAG (sum(fbje) / SUM (fbsl), 1, 0) OVER (PARTITION BY fzqdm ORDER BY TRUNC
                                                                 (fdate))
                                                                        pre_5_avg,
                           ROW_NUMBER () OVER (PARTITION BY fzqdm ORDER BY TRUNC
                                                                        (fdate))
                                                                               rn
                      FROM a
                     WHERE TRUNC (fdate) = TRUNC (SYSDATE)
                        OR TRUNC (fdate) = TRUNC (SYSDATE - 5)) aa
             WHERE aa.rn = 2
               AND DECODE (aa.pre_5_avg,
                           0, 5,
                           ABS (100 * (aa.avg_price - aa.pre_5_avg) / aa.pre_5_avg)
                          ) >= 5) aaa,
           (SELECT fzqdm, SUM (fbje) sum_fbje,
                   ratio_to_report (SUM (fbje)) OVER () ratio
              FROM a) bbb
     WHERE aaa.fzqdm = bbb.fzqdm 
      

  2.   

    上面有点错误,后面取占比的,没有加日期条件来统计五天的量
    这个语句只是基于理想状态下的数据的,
    其实关于日期还要做修改,因为真正的交易纪录天数不会是连续的五天的,所以要把起始日期和截止日期给算出来SELECT bbb.*
      FROM (SELECT aa.fzqdm
              FROM (SELECT TRUNC (fdate), fzqdm,
                           sum(fbje) / SUM (fbsl) avg_price,
                           LAG (sum(fbje) / SUM (fbsl), 1, 0) OVER (PARTITION BY fzqdm ORDER BY TRUNC
                                                                 (fdate))
                                                                        pre_5_avg,
                           ROW_NUMBER () OVER (PARTITION BY fzqdm ORDER BY TRUNC
                                                                        (fdate) desc)
                                                                               rn
                      FROM a
                     WHERE TRUNC (fdate) = TRUNC (SYSDATE)
                        OR TRUNC (fdate) = TRUNC (SYSDATE - 5)) aa
             WHERE aa.rn = 1
               AND DECODE (aa.pre_5_avg,
                           0, 5,
                           ABS (100 * (aa.avg_price - aa.pre_5_avg) / aa.pre_5_avg)
                          ) >= 5) aaa,
           (SELECT fzqdm, SUM (fbje) sum_fbje,
                   ratio_to_report (SUM (fbje)) OVER () ratio
              FROM a
            where fdate between trunc(sysdate-5) and trunc(sysdate)+0.99999) bbb
     WHERE aaa.fzqdm = bbb.fzqdm