求一函数或sql的写法?

无爱大叔 2013-12-12 06:25:07
表结构及内容如下:
数量 日期 是否结算
1023.00 2013-12-9 N
1998.00 2013-12-8 N
1999.00 2013-12-7 Y
2525.00 2013-12-6 N
2397.00 2013-12-5 N

查询2013-12-9这个日期及其之前的日期,是否结算字段是N则累加数量(碰到Y则停止累加),如上数据的计算过程应该是:
1023.00
1998.00 +
------------
3021.00
...全文
114 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
CT_LXL 2013-12-12
  • 打赏
  • 举报
回复
下面这个应该可以:
with test as
 (select 1023 amt, to_date('2013-12-09', 'yyyy-mm-dd') dt, 'N' Lable
    from dual
  union all
  select 1998 amt, to_date('2013-12-08', 'yyyy-mm-dd') dt, 'N' Lable
    from dual
  union all
  select 1999 amt, to_date('2013-12-07', 'yyyy-mm-dd') dt, 'Y' Lable
    from dual
  union all
  select 2525 amt, to_date('2013-12-06', 'yyyy-mm-dd') dt, 'N' Lable
    from dual
  union all
  select 2397 amt, to_date('2013-12-05', 'yyyy-mm-dd') dt, 'Y' Lable
    from dual
  union all
  select 2525 amt, to_date('2013-12-04', 'yyyy-mm-dd') dt, 'N' Lable
    from dual
  union all
  select 2525 amt, to_date('2013-12-03', 'yyyy-mm-dd') dt, 'Y' Lable
    from dual
  union all
  select 2525 amt, to_date('2013-12-02', 'yyyy-mm-dd') dt, 'N' Lable
    from dual)
select t1.amt,
       t1.dt,
       t1.lable,
       (select sum(t2.amt)
          from test t2
         where t2.dt >= t1.dt
           and t2.dt < decode((select min(dt)
                                from test t3
                               where t3.dt > t1.dt
                                 and t3.lable = 'Y'),
                              null,
                              t2.dt + 1,
                              (select min(dt)
                                 from test t3
                                where t3.dt > t1.dt
                                  and t3.lable = 'Y')))TOTAL
  from test t1
CT_LXL 2013-12-12
  • 打赏
  • 举报
回复
#2有问题,Ignore
CT_LXL 2013-12-12
  • 打赏
  • 举报
回复
引用 楼主 xhbmj 的回复:
表结构及内容如下: 数量 日期 是否结算 1023.00 2013-12-9 N 1998.00 2013-12-8 N 1999.00 2013-12-7 Y 2525.00 2013-12-6 N 2397.00 2013-12-5 N 查询2013-12-9这个日期及其之前的日期,是否结算字段是N则累加数量(碰到Y则停止累加),如上数据的计算过程应该是: 1023.00 1998.00 + ------------ 3021.00

with test as
 (select 1023 amt, to_date('2013-12-09', 'yyyy-mm-dd') dt, 'N' Lable
    from dual
  union all
  select 1998 amt, to_date('2013-12-08', 'yyyy-mm-dd') dt, 'N' Lable
    from dual
  union all
  select 1999 amt, to_date('2013-12-07', 'yyyy-mm-dd') dt, 'Y' Lable
    from dual
  union all
  select 2525 amt, to_date('2013-12-06', 'yyyy-mm-dd') dt, 'N' Lable
    from dual
  union all
  select 2397 amt, to_date('2013-12-05', 'yyyy-mm-dd') dt, 'N' Lable
    from dual)
SELECT T.*,
       SUM(DECODE(T.LABLE, 'N', T.AMT, 0)) OVER(ORDER BY T.DT DESC) TOTAL
  FROM TEST T;
大话EPM 2013-12-12
  • 打赏
  • 举报
回复
我排序了下时间,写了一个,坐等高手解答
WITH t AS
(SELECT 1023 mt,DATE '2013-12-9' dat,'n' flag FROM dual
UNION ALL
SELECT 1998 mt,DATE '2013-12-8' dat,'n' flag FROM dual
UNION ALL
SELECT 1999 mt,DATE '2013-12-7' dat,'y' flag FROM dual
UNION ALL
SELECT 2525 mt,DATE '2013-12-6' dat,'n' flag FROM dual
UNION ALL
SELECT 1999 mt,DATE '2013-12-4' dat,'y' flag FROM dual
UNION ALL
SELECT 2397 mt,DATE '2013-12-5' dat,'n' flag FROM dual
),
a AS (SELECT mt,dat,flag,ROWNUM rn FROM t WHERE t.dat <=DATE'2013-12-9' AND t.flag = 'y' ORDER BY dat DESC)
SELECT SUM(T.MT)
  FROM T, A
 WHERE T.DAT <= DATE '2013-12-9'
   AND T.DAT > A.DAT
   AND A.RN = 1
 ORDER BY T.DAT DESC;

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧