如上图数据显示这是我想要得到的结果,请问sql语句该怎么写等于就是前4列要做成一条数据,把MOS值,这个是指标,需要得到它下面的得分,上周期得分,同比值。然后写在一行上面这是我写的sql语句,后面不知道该怎么写了,思索了一天了求大神解答
select 列1,列2,
 case  when 列3 not in ('同比','得分','上周期得分') then 列3 else null end label1,
 max(case  when 列3 = '得分' then result_field else null end) 得分, 
 max(case  when 列3 = '同比' then result_field else null end) 同比,
 max(case  when 列3 = '上周期得分' then result_field else null end) 上周期得分
from cfg_qa_scene group by 列1,列2,列3,result_field这样写出来的结果是8条数据
SQLselectlabeloracle

解决方案 »

  1.   

    select 列1,列2,
     case  when 列3 not in ('同比','得分','上周期得分') then 列3 else null end 列3,
     case  when 列3 = '得分' then 列4 else null end 得分, 
     case  when 列3 = '上周期得分' then 列4 else null end 上周期得分,
     case  when 列3 = '同比' then 列4 else null end 同比
    from cfg_qa_scene
    上个语句写错了。。重新发一下
      

  2.   

    select 列1,列2,
     sum(case  when 列3 not in ('同比','得分','上周期得分') then 列3 else null end)列3,
     sum(case  when 列3 = '得分' then 列4 else null end) 得分, 
     sum(case  when 列3 = '上周期得分' then 列4 else null end) 上周期得分,
     sum(case  when 列3 = '同比' then 列4 else null end )同比
    from cfg_qa_scene
      

  3.   

    with tt as
     (select t.*,
             case
               when rownum <= 3 then
                'MOS值'
               else
                '下载速率(KBps)'
             end 列5
        from cfg_qa_scene  t
       where t.列3 not in ('MOS值', '下载速率(KBps)'))
    select 列1,
           列2,
           列5,
           max(case
                 when 列3 = '得分' then
                  列4
                 else
                  null
               end) 得分,
           max(case
                 when 列3 = '上周期得分' then
                  列4
                 else
                  null
               end) 上周期得分,
           max(case
                 when 列3 = '同比' then
                  列4
                 else
                  null
               end) 同比
      from tt
     group by 列1, 列2, 列5;
      

  4.   


    你这个写的是根据我的测试数据写死的吧。。能不能有个通用的,我的数据不是只有这么几条的,有很多,能不能写过通用的呢这个的数据就差不多了,得到的结果是下图
    那问问题得说清楚噢。
    给出create 和 insert 脚本吧。。多搞点数据
      

  5.   


    你这个写的是根据我的测试数据写死的吧。。能不能有个通用的,我的数据不是只有这么几条的,有很多,能不能写过通用的呢这个的数据就差不多了,得到的结果是下图
    那问问题得说清楚噢。
    给出create 和 insert 脚本吧。。多搞点数据prompt PL/SQL Developer import file
    prompt Created on 2013年5月20日 by METARNET
    set feedback off
    set define off
    prompt Creating A...
    create table A
    (
      "level1"   VARCHAR2(20),
      level2     VARCHAR2(50),
      level3     VARCHAR2(50),
      fieldvalue VARCHAR2(50)
    )
    tablespace USERS
      pctfree 10
      initrans 1
      maxtrans 255
      storage
      (
        initial 64K
        minextents 1
        maxextents unlimited
      );prompt Disabling triggers for A...
    alter table A disable all triggers;
    prompt Loading A...
    insert into A ("level1", level2, level3, fieldvalue)
    values ('拨测', '拨测结果', 'MOS值', 'f001');
    insert into A ("level1", level2, level3, fieldvalue)
    values ('拨测', '拨测结果', '得分', 'f002');
    insert into A ("level1", level2, level3, fieldvalue)
    values ('拨测', '拨测结果', '上周期得分', 'f003');
    insert into A ("level1", level2, level3, fieldvalue)
    values ('拨测', '拨测结果', '同比', 'f004');
    insert into A ("level1", level2, level3, fieldvalue)
    values ('拨测', '拨测结果', '下载速率(KBps)', 'f005');
    insert into A ("level1", level2, level3, fieldvalue)
    values ('拨测', '拨测结果', '得分', 'f006');
    insert into A ("level1", level2, level3, fieldvalue)
    values ('拨测', '拨测结果', '上周期得分', 'f007');
    insert into A ("level1", level2, level3, fieldvalue)
    values ('拨测', '拨测结果', '同比', 'f008');
    insert into A ("level1", level2, level3, fieldvalue)
    values ('波动' || chr(10) || '', '波动结果', '上周期得分', 'f011');
    insert into A ("level1", level2, level3, fieldvalue)
    values ('波动', '波动结果', '同比', 'f012');
    insert into A ("level1", level2, level3, fieldvalue)
    values ('波动' || chr(10) || '', '波动结果', '波动值', 'f009');
    insert into A ("level1", level2, level3, fieldvalue)
    values ('波动' || chr(10) || '', '波动结果', '得分', 'f010');
    insert into A ("level1", level2, level3, fieldvalue)
    values ('波动', '波动结果', '波动速率(KBps)' || chr(10) || '', 'f013');
    insert into A ("level1", level2, level3, fieldvalue)
    values ('波动', '波动结果', '得分', 'f014');
    insert into A ("level1", level2, level3, fieldvalue)
    values ('波动', '波动结果', '上周期得分', 'f015');
    insert into A ("level1", level2, level3, fieldvalue)
    values ('波动', '波动结果', '同比', 'f016');
    insert into A ("level1", level2, level3, fieldvalue)
    values ('评测' || chr(10) || '', '评测结果', '评测值', 'f017');
    insert into A ("level1", level2, level3, fieldvalue)
    values ('评测' || chr(10) || '', '评测结果', '得分', 'f018');
    insert into A ("level1", level2, level3, fieldvalue)
    values ('评测' || chr(10) || '', '评测结果', '上周期得分', 'f019');
    insert into A ("level1", level2, level3, fieldvalue)
    values ('评测', '评测结果', '同比', 'f020');
    commit;
    prompt 20 records loaded
    prompt Enabling triggers for A...
    alter table A enable all triggers;
    set feedback on
    set define on
    prompt Done.好的,这是一些测试数据,基本是都是按照4条一组的形式存储的,level3的值不是固定的,得想办法得到值存储才行,比方说MOS值,得分,上周期得分,同比,后面得分,上周期得分,同比这三个是死的,但MOS值这个必须得从数据库里得到才行,不是固定的
      

  6.   

    感觉你这个表设计的极其有问题,
    比如我按照你的insert插入后,我怎么知道这个"上周期得分"是属于'波动值'的还是'波动速率(KBps)'的???
      

  7.   

    木有办法啊,当初就这么做的,想了两天没想出来怎么做这东西,数据是这么录入的
    select level1,LEVEL2,
     case  when level3 not in ('同比','得分','上周期得分') then level3 else null end label1,
     case  when level3 = '得分' then fieldvalue else null end 得分, 
     case  when level3 = '同比' then fieldvalue else null end 同比,
     case  when level3 = '上周期得分' then fieldvalue else null end 上周期得分
    from a 
    暂时只想了这个方法,就是靠后台循环处理了
      

  8.   

    所以在想能不能用sql一条语句写出来试试。。也没什么其他的方法
      

  9.   

    好吧,结贴了,哎
     select level2,level4, 
    max(case  when level3 not in ('同比','得分','上周期得分') then level3 end), 
    max(case  when level3 = '得分' then fieldvalue else null end),
    max(case  when level3 = '同比' then fieldvalue else null end),
    max(case  when level3 = '上周期得分' then fieldvalue else null end)
    from a 
     group by level4,level2
    以前就是这样写的。。level4是加的归属