【问题标题】:Select Oracle result two lines for same cases为相同的案例选择 Oracle 结果两行
【发布时间】:2014-12-01 23:21:16
【问题描述】:

我在 Oracle 数据库 11g 中有这张表:

    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

基本就是QTDNEG/QTD_CONTROLE,结果一定是行数。

我将在 FreeReport 中使用结果打印标签,

我尝试使用 Oracle Views 来获得结果,但对我来说很难。

另一个例子:

    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

【问题讨论】:

  • 您想要整数除法产生的每个 nunota/sequencia 的行数?请更具体。
  • 我想要每个 QTDNEG / QTD_CONTROLE 一行
  • 我认为您想根据 QTDNEG 列将行拆分为 30 的倍数,不是吗?
  • 抱歉,不明白。

标签: sql oracle select view oracle11g


【解决方案1】:

解决此问题的一种方法是生成一个“足够大”的数字列表,然后加入该列表。我认为结果查询(在你的情况下)是这样的:

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 ;

【讨论】:

    【解决方案2】:

    递归解决方案(可从 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
    

    【讨论】:

      【解决方案3】:

      试试这个:

      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
      

      【讨论】:

        猜你喜欢
        • 2016-01-19
        • 1970-01-01
        • 2016-09-23
        • 1970-01-01
        • 1970-01-01
        • 2022-07-17
        • 2014-05-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多