这是我的表 现在想生成如下这样一个视图:请教高手们帮忙写出这个视图的sql语名,积数的计算可用函数,十分感谢!

解决方案 »

  1.   

    1月1号 相当于期初,为第一天1月3号 为什么记作3,因为1月1号 和1月3号之间还有1月2号,只是1月2号没交易了。1月10号的300应该记10天。比如:2月10就记 40天:
    也就是:
    select to_date('2008-02-10','yyyy-mm-dd')-to_date('2008-01-01','yyyy-mm-dd') from dual就像下面这张图一样道理一样:我这个地方就是要求积数,那有函数啊。请高手帮忙看一下。
      

  2.   

    select 日期,库存,(日期-某个日期),积数函数
    from 表
      

  3.   

    生成四条测试数据WITH a AS
         (SELECT TO_DATE ('2008-01-01', 'yyyy-mm-dd') dt, 100 kc
            FROM DUAL
          UNION ALL
          SELECT TO_DATE ('2008-01-03', 'yyyy-mm-dd') dt, 300 kc
            FROM DUAL
          UNION ALL
          SELECT TO_DATE ('2008-01-10', 'yyyy-mm-dd') dt, 900 kc
            FROM DUAL
          UNION ALL
          SELECT TO_DATE ('2008-01-15', 'yyyy-mm-dd') dt, 1000 kc
            FROM DUAL)
    SELECT *
      FROM a
    测试数据集
    Row# DT KC1 2008/1/1 100
    2 2008/1/3 300
    3 2008/1/10 900
    4 2008/1/15 1000
    按你的要求写的语句SELECT aa.dt 时间, aa.kc 库存, aa.days 天数,
           SUM (sum_day) OVER (ORDER BY aa.dt) + aa.kc 积数
      FROM (SELECT a.dt, a.kc, a.dt - FIRST_VALUE (dt) OVER (ORDER BY dt)
                               + 1 days,
                     LAG (kc, 1, 0) OVER (ORDER BY dt)
                   * TRUNC (a.dt - LAG (dt, 1, a.dt - 1) OVER (ORDER BY dt))
                                                                          sum_day
              FROM a) aa结果集Row# 时间 库存 天数 积数1 2008/1/1 100 1 100
    2 2008/1/3 300 3 500
    3 2008/1/10 900 10 3200
    4 2008/1/15 1000 15 7800
      

  4.   

    此处为生成测试数据
    WITH a AS
         (SELECT TO_DATE ('2008-01-01', 'yyyy-mm-dd') dt, 100 kc
            FROM DUAL
          UNION ALL
          SELECT TO_DATE ('2008-01-03', 'yyyy-mm-dd') dt, 300 kc
            FROM DUAL
          UNION ALL
          SELECT TO_DATE ('2008-01-10', 'yyyy-mm-dd') dt, 900 kc
            FROM DUAL
          UNION ALL
          SELECT TO_DATE ('2008-01-15', 'yyyy-mm-dd') dt, 1000 kc
            FROM DUAL)
    Row#    日期         库存1       2008/1/1        100
    2       2008/1/3        300
    3       2008/1/10       900
    4       2008/1/15       1000==================================
    sql语句
    SELECT aa.dt 时间, aa.kc 库存, aa.days 天数,
           SUM (sum_day) OVER (ORDER BY aa.dt) + aa.kc 积数
      FROM (SELECT a.dt, a.kc, a.dt - FIRST_VALUE (dt) OVER (ORDER BY dt)
                               + 1 days,
                     LAG (kc, 1, 0) OVER (ORDER BY dt)
                   * TRUNC (a.dt - LAG (dt, 1, a.dt - 1) OVER (ORDER BY dt))
                                                                          sum_day
              FROM a) aa
    结果
    Row#    时间               库存    天数      积数1       2008/1/1        100     1       100
    2       2008/1/3        300     3       500
    3       2008/1/10       900     10      3200
    4       2008/1/15       1000    15      7800
      

  5.   

    表A      dat            num
    2008-1-1 100
    2008-1-3 300
    2008-1-10 300
    2008-1-12 200
    2008-2-26 100函数
    CREATE OR REPLACE FUNCTION f
    (
      p_num NUMBER
     ,p_dat DATE
    ) RETURN NUMBER AS
      cumnum NUMBER;
    BEGIN
      SELECT SUM(val)
        INTO cumnum
        FROM (SELECT ((dat - trunc(p_dat) + 1) -
                     lag((dat - trunc(p_dat) + 1), 1, 0) over(ORDER BY dat)) *
                     lag(num, 1, 0) over(ORDER BY dat) val
                    ,rownum rn
                FROM a)
       WHERE rn <= p_num;
      RETURN cumnum;
    END;视图
    CREATE OR REPLACE VIEW V AS
    SELECT dat
          ,num
          ,dat - trunc(SYSDATE,'yyyy') + 1 DAY
          ,f(ROWNUM,trunc(SYSDATE,'yyyy')) + num cumnum
      FROM a结果
    select * from vDAT    NUM   DAY CUMNUM
    2008-1-1   100   1 100
    2008-1-3   300   3 500
    2008-1-10  300   10 2600
    2008-1-12  200   12 3100
    2008-2-26  100   57 12000已经假定你的数据日期是有顺序的,如果乱序要改一下,先排好序.
    f的两个参数第一个是rownum,不用变,第二个是期初第一天.
    不知道是不是你要的,不对的话改改也就行了,反正是可实现的.
      

  6.   

    我顶6楼,分析函数还能用sum和first_value...受教了...
      

  7.   

    还是学的不够精深啊,所以多用了函数...LZ用hebo2005的方法就行了...简单而且效率也是最好的.
      

  8.   

    实际运用不一定能这样子用,因为要看数据量的
    好几个分析函数里都用到order by 的话,这是很耗时间的操作