如何在具有边界更改的表中输入初始状态

时间:2017-05-30 11:11:38

标签: sql oracle11g

我在计算当月的销售额时遇到了问题(工作非常慢),因为我有一张大表,其中有几年的销售额。所以我在每个月的开始找到一个解决方案,计算初始状态直到当月的第1个,所以对于当月14日的销售,只需使用1到14之间的总和(这两个日期之间的实际销售额+初始状态) 。我还添加了一个新列,它将为我提供信息,它是IS(初始状态)还是销售,所以我可以将这两个信息分开。

目标表是zal_3b_orgjed

orgjed   |  date    |   rgrupa  |  sifra  |  velicina  |  quantity `| ISIS


 221       01-AUG-17    300       3000101      0             1

ISIS不是伊斯兰国家,它是IS初始状态的首字母缩写(记录:)) 该列有两个状态,D -is初始状态,N-它不是初始状态

我有这样的查询

     insert into zal_3b_orgjed



     select
           orgjed,to_date('01.01.2016','dd.mm.yyyy') as datum,rgrupa, sifra, 
           velicina,  sum(kolicina) , 'D'
    from 
          zal_3b_orgjedsavke 
    where 
          datum <= to_date('31.12.2015','dd.mm.yyyy')
          and sysdate > to_date('31.12.2015','dd.mm.yyyy')
    having 
          sum(kolicina) !=0  

    group by 
           orgjed, rgrupa, sifra, velicina

    union


    select 
           orgjed,to_date('01.02.2016','dd.mm.yyyy') as datum,rgrupa, sifra, 
           velicina,  sum(kolicina)  ,'D'
    from   
           zal_3b_orgjedsavke

    where 
          datum <= to_date('31.01.2016','dd.mm.yyyy')
          and sysdate > to_date('31.01.2016','dd.mm.yyyy')

   having 
          sum(kolicina) !=0 
   group by 
           orgjed, rgrupa, sifra, velicina 

这只是工会的一部分,因为你可以看到有很多工会,而且每个月的第一个月我需要再增加一个工会。是否有一种简单的方法可以做到这一点,而不是手动。我有一些想法,但不知道如何在循环中获得联合。 可以帮一下吗?

1 个答案:

答案 0 :(得分:0)

单个查询怎么样?

select orgjed, trunc(datum, 'MON') as datum, rgrupa, sifra, velicina,
       sum(kolicina), 'D'
from zal_3b_orgjedsavke 
group by trunc(datum, 'MON'), orgjed, rgrupa, sifra, velicina
having sum(kolicina) <> 0  ;

这只会将datum截断到本月的第一天。

如果要限制日期范围,可能仍需要WHERE子句。