2014-10-07 75 views
1

我有这个表中的Oracle数据库11g:选择Oracle结果两行相同的情况下

NUNOTA SEQUENCIA QTD_CONTROLE  QTDNEG 
---------- ---------- ------------ ---------- 
     446   1   30   60 
     446   2   30   30 
     446   3   30  120 

我需要获得这样的结果:

NUNOTA SEQUENCIA QTD_CONTROLE  QTDNEG 
---------- ---------- ------------ ---------- 
     446   1   30   30 
     446   1   30   30 
     446   2   30   30 
     446   3   30   30 
     446   3   30   30 
     446   3   30   30 
     446   3   30   30 

这是basicly QTDNEG/QTD_CONTROLE和结果必须是行数。

我会用结果来打印标签,在FreeReport,

我试图使用Oracle视图来得到的结果却是难受。

又如:

NUNOTA SEQUENCIA QTD_CONTROLE  QTDNEG 
---------- ---------- ------------ ---------- 
     446   1   30   60 
     446   2   100  300 
     446   3   15   30 

结果应该是接近,这是通过生成号码列表是“足够大”,然后在加入到列表

NUNOTA SEQUENCIA QTD_CONTROLE  QTDNEG 
---------- ---------- ------------ ---------- 
     446   1   30   30 
     446   1   30   30 
     446   2   100  100 
     446   2   100  100 
     446   2   100  100 
     446   3   15   15 
     446   3   15   15 
+1

你想整数除法产生的每个nunota/sequencia的行数?请更具体一些。 – OldProgrammer 2014-10-07 13:52:00

+0

我想要每行QTDNEG/QTD_CONTROLE – user11965 2014-10-07 14:01:22

+0

我想你想根据'QTDNEG'列将行分割为30的倍数,不是吗? – 2014-10-07 14:03:32

回答

0

试试这个:

with t_res (NUNOTA,SEQUENCIA,QTD_CONTROLE,QTDNEG, lvl) as (
    select NUNOTA,SEQUENCIA,QTD_CONTROLE,QTDNEG, 1 
    from t 
    union all 
    select t.NUNOTA,t.SEQUENCIA,t.QTD_CONTROLE,t.QTDNEG, t_res.lvl + 1 
    from t, t_res 
    where t_res.lvl < t.QTDNEG/t.QTD_CONTROLE 
) 
select unique NUNOTA,SEQUENCIA,QTD_CONTROLE,QTD_CONTROLE, lvl 
    from t_res 
order by SEQUENCIA, lvl 


NUNOTA SEQUENCIA QTD_CONTROLE QTD_CONTROLE LVL 
------------------------------------------------------- 
    446   1    30    30  1 
    446   1    30    30  2 
    446   2    30    30  1 
    446   3    30    30  1 
    446   3    30    30  2 
    446   3    30    30  3 
    446   3    30    30  4 
0

的一种方式。我想生成的查询(你的情况)是这样的:

with n(n) as (
     select level 
     from dual 
     where level <= 100 
    ) 
select tt.NUNOTA, tt.SEQUENCIA, tt.QTD_CONTROLE, 30 as QTDNEG 
from thistable tt join 
    n 
    on n.n <= tt.QTDNEG/tt.QTD_CONTROLE ; 
1

递归解决方案(可从Oracle 11gR2中):

with t(nunota, sequencia, qtd_controle, qtdneg) as 
    (select nunota 
     , sequencia 
     , qtd_controle 
     , qtdneg 
    from mytable 
    union all 
    select nunota 
     , sequencia 
     , qtd_controle 
     , qtdneg - qtd_controle 
    from t 
    where qtdneg - qtd_controle > 0) 
select nunota 
    , sequencia 
    , qtd_controle 
    , least(qtdneg, qtd_controle) 
from t 
order by nunota 
     , sequencia 
     , least(qtdneg, qtd_controle) desc