【问题标题】:Sum between two tables两个表之间的总和
【发布时间】:2017-10-19 15:04:33
【问题描述】:

我有两张桌子:

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 加上表 2 指定日期(2017 年 4 月 30 日)下月初(2017 年 4 月 1 日)到月底的总和。在这种情况下,总和应该是 910。

谢谢, S

【问题讨论】:

  • 造成你困难的部分是什么?
  • 到目前为止你尝试了什么?

标签: sql oracle oracle11g


【解决方案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;

【讨论】:

  • 对不起,我用附加条件编辑了最初的问题。
【解决方案2】:

最简单的是:

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' 

【讨论】:

  • 对日期使用字符串意味着 Oracle 将使用 TO_DATE( string, format_model ) 执行隐式转换,其中格式模型由 NLS_DATE_FORMAT 会话参数给出,如果不是 DDMonYYYY,则查询将引发一个例外。每个用户都可以设置自己的会话参数,更改它会中断查询,而无需更改查询。最好使用像 DATE '2017-01-01' 这样不依赖任何隐式转换或会话参数的日期文字。
  • 不知道。谢谢。修改答案以反映。
猜你喜欢
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
  • 2020-01-16
  • 1970-01-01
  • 1970-01-01
  • 2020-10-11
  • 2020-10-19
  • 1970-01-01
相关资源
最近更新 更多