Orcle查询问题

zekelove 2010-11-21 09:10:43
有以下这样的一个表数据:
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值的和

请高手们帮帮忙~~~~~~~~~
...全文
145 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zekelove 2010-11-21
  • 打赏
  • 举报
回复
经过综合考虑 这个方法是最适用的
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
zekelove 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 coolkisses 的回复:]
type=2 取value2值 ?

但上面给结果样例是

id name yearmon value1 value2
1 a 201001 14 14+8

明明是两个value1的加总啊
[/Quote]

这样给你说吧,总之我就是需要type=1的记录,然后增加新的一列value3=value1+value2的和
value1的取值就是type=1的值
value2的取值就是type=2的值
没有的就取0
zekelove 2010-11-21
  • 打赏
  • 举报
回复
感谢各位朋友的帮忙,楼主3和楼主8理解的非常准确
已经给出了正确的答案。
coolkisses 2010-11-21
  • 打赏
  • 举报
回复
重新看了下要求
根据type的不同,type=1取value1 和 type=2取value2值的和

按这样的理解,就应该是 14 + NULL => 14,而不是楼主给的样例
1 a 201001 14 14+8 (这里的8 明显是value 1 嘛)
  • 打赏
  • 举报
回复

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
coolkisses 2010-11-21
  • 打赏
  • 举报
回复
type=2 取value2值 ?

但上面给结果样例是

id name yearmon value1 value2
1 a 201001 14 14+8

明明是两个value1的加总啊



zekelove 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yy_mm_dd 的回复:]
引用 4 楼 zhf1206 的回复:
引用 1 楼 yy_mm_dd 的回复:
select min(id),
name,
yearmon,
sum(decode(type,1,value1,0)) value1,
sum(value1) value2
group by name,yearmon


我的意思是根据type来获取新的一列值是 value1+value2的和
……
[/Quote]
这次理解是准确的,没有就取0值~~~
YY_MM_DD 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhf1206 的回复:]
引用 1 楼 yy_mm_dd 的回复:
select min(id),
name,
yearmon,
sum(decode(type,1,value1,0)) value1,
sum(value1) value2
group by name,yearmon


我的意思是根据type来获取新的一列值是 value1+value2的和
比如type=1 取value1值
……
[/Quote]
如果同一日期下的记录存在
type=1,type=2 :value2 = value1+value2
type=1, type没: value2 = value1
这个我的理解对不对?
如果是下面的情况呢?
type没,type=2:取什么呢?
zekelove 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yy_mm_dd 的回复:]
select min(id),
name,
yearmon,
sum(decode(type,1,value1,0)) value1,
sum(value1) value2
group by name,yearmon
[/Quote]

我的意思是根据type来获取新的一列值是 value1+value2的和
比如type=1 取value1值
type=2 取value2值
是这两个值的和,但是日期都要是type=1的日期
coolkisses 2010-11-21
  • 打赏
  • 举报
回复
方法1.将源折分为 2 张表 (type = 1 / type = 2),然后再组合
方法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;
YY_MM_DD 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 zhf1206 的回复:]
有以下这样的一个表数据:
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……
[/Quote]

我感觉你这个需求说得好绕啊。。。
如果有type=2的求value1的总和,
没有type=2取得value1,你不觉得就是一句话吗?
就是不管type是1,还是2都是取value1的总和。
YY_MM_DD 2010-11-21
  • 打赏
  • 举报
回复
select min(id),
name,
yearmon,
sum(decode(type,1,value1,0)) value1,
sum(value1) value2
group by name,yearmon

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧