当前位置: 代码迷 >> Oracle管理 >> 这个要求的SQL如何写
  详细解决方案

这个要求的SQL如何写

热度:134   发布时间:2016-04-24 04:06:40.0
这个要求的SQL怎么写?
本帖最后由 huo90 于 2015-03-19 23:09:38 编辑
表:


查询要求:
相同code值的remark字段拼接一起(顺序不要求),其他字段值取参照LEVEL值最大的其他字段,LEVEL最大值相同的记录取其中一条就行。如下面的查询结果。

查询结果:

------解决思路----------------------
SELECT CODE, LEVEL, COLOR, COLOR_NAME, WMSYS.WM_CONCAT(REMARK)
  FROM TABLE_NAME
 GROUP BY CODE, LEVEL, COLOR, COLOR_NAME

函数WMSYS.WM_CONCAT()的用法你可以上网查一下
------解决思路----------------------
with a as
(select 11 code, 1 tlevel, 'red' color ,'红' color_name, '备注1' remark from dual 
union all
select 22 code, 2 , 'blue' , '蓝' color_name, '备注2' remark from dual 
union all
select 11 code, 1 , 'red' , '红' color_name, '备注3' remark from dual 
union all
select 12 code, 0 , 'gray' , '灰' color_name, '备注4' remark from dual 
union all
select 13 code, 2 , 'blue' , '蓝' color_name, '备注5' remark from dual 
union all
select 11 code, 0 , 'gray' , '灰' color_name, '备注6' remark from dual 
union all
select 12 code, 2 , 'blue' , '蓝' color_name, '备注7' remark from dual 
)
select code,max(tlevel),max(color),max(color_name),wmsys.wm_concat(remark) from a 
group by code


注意不要使用level这样的关键字
------解决思路----------------------
with a as
     ( select 11 code, 1 tlevel, 'red' color ,'红' color_name, '备注1' remark from dual 
       union all select 22 code, 2 , 'blue' , '蓝' color_name, '备注2' remark from dual 
       union all select 11 code, 1 , 'red' , '红' color_name, '备注3' remark from dual 
       union all select 12 code, 0 , 'gray' , '灰' color_name, '备注4' remark from dual 
       union all select 13 code, 2 , 'blue' , '蓝' color_name, '备注5' remark from dual 
       union all select 11 code, 0 , 'gray' , '灰' color_name, '备注6' remark from dual 
       union all select 12 code, 2 , 'blue' , '蓝' color_name, '备注7' remark from dual ),
     b as
     ( select distinct 
              first_value(code) over(partition by code order by tlevel desc) as code,
              first_value(tlevel) over(partition by code order by tlevel desc) as tlevel,
              first_value(color) over(partition by code order by tlevel desc) as color,
              first_value(color_name) over(partition by code order by tlevel desc) as color_name   
         from a ),
     c as
     ( select dbms_lob.substr(wmsys.wm_concat(remark),1000) as remark, code from a
        group by code )
select b.*, c.remark
  from b, c   
 where c.code = b.code;
------解决思路----------------------
select code,max(tlevel),max(color)keep(dense_rank last order by tlevel),max(color_name)max(color)keep(dense_rank last order by tlevel),wmsys.wm_concat(remark) from a 
group by code
  相关解决方案