有以下这样的一个表数据:
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值的和请高手们帮帮忙~~~~~~~~~

解决方案 »

  1.   

    select min(id),
           name,
           yearmon, 
           sum(decode(type,1,value1,0)) value1,
           sum(value1) value2
    group by name,yearmon
      

  2.   


    我感觉你这个需求说得好绕啊
    如果有type=2的求value1的总和,
    没有type=2取得value1,你不觉得就是一句话吗?
    就是不管type是1,还是2都是取value1的总和。
      

  3.   

    方法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;
      

  4.   


    我的意思是根据type来获取新的一列值是 value1+value2的和
    比如type=1 取value1值
        type=2 取value2值
    是这两个值的和,但是日期都要是type=1的日期
      

  5.   

    如果同一日期下的记录存在
    type=1,type=2 :value2 = value1+value2
    type=1, type没: value2 = value1
    这个我的理解对不对?
    如果是下面的情况呢?
    type没,type=2:取什么呢?
      

  6.   

    type=2 取value2值 ?但上面给结果样例是id name yearmon value1 value2
    1 a 201001 14 14+8明明是两个value1的加总啊
      

  7.   


    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
      

  8.   

    重新看了下要求
    根据type的不同,type=1取value1 和 type=2取value2值的和按这样的理解,就应该是 14 + NULL => 14,而不是楼主给的样例
    1 a 201001 14 14+8 (这里的8 明显是value 1 嘛)
      

  9.   


    这样给你说吧,总之我就是需要type=1的记录,然后增加新的一列value3=value1+value2的和
    value1的取值就是type=1的值
    value2的取值就是type=2的值
    没有的就取0
      

  10.   

    经过综合考虑 这个方法是最适用的
    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