两个表之间的总和

时间:2017-05-19 12:59:01

标签: sql oracle oracle11g

我有两张桌子:

table1

date      value code
01-Jan-17   230 B2
01-Feb-17   100 B2
01-Mar-17   30  B2
01-Jan-17   56  C1
01-Feb-17   90  C1

table2

date    value   code
01-Apr-17   50  B2
02-Apr-17   160 B2
03-Apr-17   210 B2
04-Apr-17   130 B2
01-May-17   113 B2
02-May-17   106 B2
01-Apr-17   83  C1
02-Apr-17   20  C1

很抱歉,从一开始就不清楚,我之前提到的并不简单,我忘了添加两个条件。

1)如果在我指定日期(2017年3月2日)的条件下,如果它小于或等于table1的最大日期,那么它应该仅对table1值求和并从指定日期的年份开始( 2017年1月1日)至指定日期月末(2017年3月31日)。因此,在这种情况下,总和应该是360。

2)如果我在指定日期(2017年4月3日)的情况下,如果它超过table1的最大日期,那么它应该从指定日期的年初开始(2017年1月1日)的总和值到表1的最大日期加上下月初(2017年4月1日)到表2的指定日期月末(2017年4月30日)的总和。在这种情况下,总和应该是910。

感谢, 小号

2 个答案:

答案 0 :(得分:1)

这只是union all和一些where逻辑:

select sum(value), code
from ((select value, code
       from t1
       where dte >= date '2017-03-01' and dte < date '2017-04-01'
      ) union all
      (select value, code
       from t1
       where dte >= date '2017-04-01' and dte < date '2017-05-01'
      )
     ) vb
group by code;

答案 1 :(得分:1)

最简单的是:

Select 
 (Select Sum(value) from table1
  where code = 'B2' 
    and date between DATE '2017-01-01' 
                 and DATE '2017-03-31')
   +
 (Select Sum(value) from table2
  where code = 'B2' 
    and date between DATE '2017-04-01' 
                 and DATE '2017-04-30')

但你也可以做一个联盟

Select Sum(value) 
  from (Select code, value from table1 
        Where date between DATE '2017-01-01' 
                       and DATE '2017-03-31')
  union all 
       (Select code, value from table1 
        Where date between DATE '2017-04-01'
                       and DATE '2017-04-30')
 where code = 'B2'