有以下这样的一个表数据:
id name yearmon type value1 value2
1 a 201001 1 14 43
2 a 201002 1 42 64
3 a 201003 1 14 53
4 a 201004 1 33 56
5 a 201005 1 42 64
6 a 201006 1 25 75
7 a 201007 1 26 45
8 a 201008 1 34 63
9 a 201009 1 38 51
10 a 201001 2 8
11 a 201002 2 5
12 a 201003 2 8
13 a 201004 2 6
14 a 201005 2 8我想得到这样的结果集,如何写查询语句:
id name yearmon value1 value2
1 a 201001 14 14+8
2 a 201002 42 42+5
3 a 201003 14 14+8
4 a 201004 33 33+6
5 a 201005 42 42+8
6 a 201006 25 25
7 a 201007 26 26
8 a 201008 34 34
9 a 201009 38 38我希望就是value2的值变为value1+value2
根据type的不同,type=1取value1 和 type=2取value2值的和请高手们帮帮忙~~~~~~~~~
id name yearmon type value1 value2
1 a 201001 1 14 43
2 a 201002 1 42 64
3 a 201003 1 14 53
4 a 201004 1 33 56
5 a 201005 1 42 64
6 a 201006 1 25 75
7 a 201007 1 26 45
8 a 201008 1 34 63
9 a 201009 1 38 51
10 a 201001 2 8
11 a 201002 2 5
12 a 201003 2 8
13 a 201004 2 6
14 a 201005 2 8我想得到这样的结果集,如何写查询语句:
id name yearmon value1 value2
1 a 201001 14 14+8
2 a 201002 42 42+5
3 a 201003 14 14+8
4 a 201004 33 33+6
5 a 201005 42 42+8
6 a 201006 25 25
7 a 201007 26 26
8 a 201008 34 34
9 a 201009 38 38我希望就是value2的值变为value1+value2
根据type的不同,type=1取value1 和 type=2取value2值的和请高手们帮帮忙~~~~~~~~~
name,
yearmon,
sum(decode(type,1,value1,0)) value1,
sum(value1) value2
group by name,yearmon
我感觉你这个需求说得好绕啊
如果有type=2的求value1的总和,
没有type=2取得value1,你不觉得就是一句话吗?
就是不管type是1,还是2都是取value1的总和。
方法2. 利用窗口函数 sum() over(),在一行中将不同type的值进行展示后一种方法,会将所有明细(包括type 1 type 2)都查询出来。看楼主给出的结果,好像只需要type = 1的明细,那就参考方法1吧。select a.id, a.name, a.yearmon, a.value1 value1, a.value1 + nvl(b.value1,0) value2
from
(select id, name, yearmon, value1
from test_value
where type = 1) a
left join (select id, name, yearmon, value1
from test_value
where type = 2) b on a.name = b.name and a.yearmon = b.yearmon
order by a.id;
我的意思是根据type来获取新的一列值是 value1+value2的和
比如type=1 取value1值
type=2 取value2值
是这两个值的和,但是日期都要是type=1的日期
type=1,type=2 :value2 = value1+value2
type=1, type没: value2 = value1
这个我的理解对不对?
如果是下面的情况呢?
type没,type=2:取什么呢?
1 a 201001 14 14+8明明是两个value1的加总啊
with tb as(
select 1 id,'a' name,'201001' yearmon,1 type,14 value1,43 value2 from dual union all
select 2,'a','201002',1,42,64 from dual union all
select 3,'a','201003',1,14,53 from dual union all
select 4,'a','201004',1,33,56 from dual union all
select 5,'a','201005',1,42,64 from dual union all
select 6,'a','201006',1,25,75 from dual union all
select 7,'a','201007',1,26,45 from dual union all
select 8,'a','201008',1,34,63 from dual union all
select 9,'a','201009',1,38,51 from dual union all
select 10,'a','201001',2,null,8 from dual union all
select 11,'a','201002',2,null,5 from dual union all
select 12,'a','201003',2,null,8 from dual union all
select 13,'a','201004',2,null,6 from dual union all
select 14,'a','201005',2,null,8 from dual)
--以上为提供数据的语句
select min(id) id,name,yearmon,max(decode(type,1,value1,null)) value1,
sum(decode(type,2,value2,value1)) value2
from tb
group by name,yearmon
order by id ID N YEARMO VALUE1 VALUE2
--------- - ------ ---------- ----------
1 a 201001 14 22
2 a 201002 42 47
3 a 201003 14 22
4 a 201004 33 39
5 a 201005 42 50
6 a 201006 25 25
7 a 201007 26 26
8 a 201008 34 34
9 a 201009 38 38
根据type的不同,type=1取value1 和 type=2取value2值的和按这样的理解,就应该是 14 + NULL => 14,而不是楼主给的样例
1 a 201001 14 14+8 (这里的8 明显是value 1 嘛)
这样给你说吧,总之我就是需要type=1的记录,然后增加新的一列value3=value1+value2的和
value1的取值就是type=1的值
value2的取值就是type=2的值
没有的就取0
Select pp.NAME,pp.YEARMON,sum(decode(pp.TYPE,'1',pp.value1,Null)),sum(decode(pp.TYPE,'2',pp.value2,pp.value1))
From Product pp
Group By pp.NAME,pp.YEARMON