//数据如下: F_YP_ID F_ITEM_CODE F_CS_CODE F_CS_NO F_AVG_CS ID 1859412 91 19 1 饱和烃 8685 1859412 91 20 1 -32.156 8686 1859412 91 19 2 芳烃 8687 1859412 91 20 2 -32.133 8688 1859412 91 19 3 非烃 8689 1859412 91 20 3 -32.121 8690 1859413 91 19 1 饱和烃 8689 1859413 91 20 1 -32.100 8690 //我想要的效果是 F_YP_ID F_CS_NO F_AVG_CS1 F_AVG_CS2 1859412 1 饱和烃 -32.156 1859412 2 芳烃 -32.133 1859412 3 非烃 -32.121 1859413 1 饱和烃 -32.100 //也就是相同F_YP_ID的相同F_CS_NO的FAVG_CS下的名称与值对应上 // //当我第一眼看到这个问题的时候,因为每两个行是一个组,用每个组里面的第二条数据与第一条数据(其中的一列) //连接起来,就得到了结果;那我们可以使用row_number()函数,为每一个分组返回一个rownum值, //然后根据每一个分组(partition by)返回一个rownum, //使用一个case(或者decode),将rownum=2的值的F_CS_NO列连接作为rownum=1的列的下一个属性列, //这样我们就构造了一行,然后遍历整个表,就得到了结果; //然而,我怎么也构造不出来,按照什么分组,然后得到这样的rownum, //或许我的思路出了问题。 //其实,我们给出的数据中一组数据是有明显的规律的,那就是F_CS_CODE列, //在每一个小分组里面它都是19,20,所以我们可以对这个列应用一个decode()函数, //所以我们有一下的解法,并不是我刚开始的那么想得复杂: -- with t as( select 1859412 a,91 b,19 c,1 d,'饱和烃' e,8685 f from dual union all select 1859412,91,20,1,'-32.156',8686 from dual union all select 1859412,91,19,2,'芳烃',8687 from dual union all select 1859412,91,20,2,'-32.133',8688 from dual union all select 1859412,91,19,3,'非烃',8689 from dual union all select 1859412,91,20,3,'-32.121',8690 from dual union all select 1859413,91,19,1,'饱和烃',8689 from dual union all select 1859413,91,20,1,'-32.100',8690 from dual) select a,d ,max(decode(c,19,e)) e1 ,max(decode(c,20,e)) e2 from t group by a,d / A D E1 E2 ---------- ---------- ------- ------- 1859412 1 饱和烃 -32.156 1859412 2 芳烃 -32.133 1859412 3 非烃 -32.121 1859413 1 饱和烃 -32.100
原帖:http://topic.csdn.net/u/20110518/16/373a496b-3a38-4a31-aab1-8b7336e2b566.html?31758