現在我有兩個表a 和b 表的簡單結構如下:
a
--------
id    sum
1     10
2     20
3     30b
--------
id    id_seqno  num   date
1           1         5  2007/1/1
1           2         4    2007/1/2
1           3         2    2007/1/3
2      1     1  2007/1/5
a中的id和b中的id相關聯。
現在我想得到這麼一個sql語句
使b中的num累加當其和正好大於與之對應的a中sum時b中的日期。
b中的數據是根據日期從小到大排序的。
這的sql語句怎麼寫呢?
還有一個問題,在delphi中我的計算字段是日期類型,我可以直接把日期類型的數據相減賦值給它嗎?
請各位達人幫忙,謝謝。

解决方案 »

  1.   

    select id, max(date)
    from b
    group by id
    having sum(num) > (select sum from a where a.id = b.id)oracle 的日期相减的到的是一个以天为单位的数,不是日期类型的。所以不能相减后賦值給它
      

  2.   

    to Eric_1999
    這樣寫不是我所求的時間
    比如表結構如下:
    a
    ----------------
    a
    --------
    id    sum
    1     10
    2     20
    3     30b
    --------
    id    id_seqno  num   date
    1           1         5  2007/1/1
    1           2         4    2007/1/2
    1           3         2    2007/1/3
    1      4     2  2007/1/4
    2      1     1  2007/1/5我想求的時間是 5+4+2 >10 時的2007/1/3
    而不是最大的那個2007/1/4
    謝謝。還有什麼其它的方法嗎?
      

  3.   

    delphi 的問題解決了。謝謝。
    現在就是那條sql語句的問題了。
    如何寫呢請各位指點。謝謝。
      

  4.   

    一个简单sql无法实现吧。
    写个function阿
      

  5.   

    function?
    那該怎麼寫呢?
    能不能給個例子?
    thank you 。
      

  6.   

    比较理解楼主设立上限报警的用意,但是我也没有想通。
    我下面的方法可以用按照id循检的方式得知,但是这样比较消耗资源。
    select xx."id",min(xx."id_seqno") from 
    (
    select b."id",b."id_seqno",sum(b."num") over ( order by b."id",b."id_seqno") as leiji
    from b
    --指定id值
    where b."id"=1 
    )
    xx,
    a
    where xx.leiji>a."sum" and xx."id"=a."id"
    group by xx."id"
    最简单的是在b上面设置一个触发器,每次有数据就统计汇总,比较后将相关结果放到另外的表里。
      

  7.   

    謝謝 microhwang的建議,我試一試,看看可以嗎?
    請問誰還有比較好的方法?謝謝
    如果我寫一個function在服務器端執行應該怎麼寫這樣的一個function呢
    如果我客戶端用delphi開發,在delphi中怎麼樣調用這個function呢?
      

  8.   

    SQL> select *from a;        ID     SUM_ID
    ---------- ----------
             1         10
             2         20
             3         30SQL> select * from b;        ID   ID_SEQNO        NUM S_DATE
    ---------- ---------- ---------- -------------------
             1          1          5 2007-01-01 00:00:00
             1          2          4 2007-01-02 00:00:00
             1          3          2 2007-01-03 00:00:00
             2          1          1 2007-01-05 00:00:00
             1          4          2 2007-01-04 00:00:00SQL> select id, num, s_date from b
      2    where exists
      3      (select 1 from
      4        (select a.id, b.id_seqno, b.s_date,
      5           row_number()over(partition by a.id order by b.snum - a.sum_id) as
    sid
      6         from a inner join
      7           (select id, id_seqno, num, s_date,
      8              sum(num)over(partition by id order by s_date)as snum
      9            from b
     10           )b on a.id = b.id
     11           where b.snum - a.sum_id >= 0
     12         ) c
     13       where b.id = c.id and b.id_seqno <= c.id_seqno and c.sid = 1)
     14  ;        ID        NUM S_DATE
    ---------- ---------- -------------------
             1          5 2007-01-01 00:00:00
             1          4 2007-01-02 00:00:00
             1          2 2007-01-03 00:00:00