对没有出现的机构数据默认为0,并且按红灯排序,再按黄灯排序,并且行转列(sql和java代码两种方法)

业务需求:按机构亮灯数排序,先按红灯数排序,再按黄灯数排序;如果没有这个机构,默认红黄灯都是0;总机构,东南区,西北区按顺序默认排在最前面

一,sql解决

select 

  deptCode,

  deptName,

  case when deptCode ='2' then 1 when deptCode ='01' then '2' when deptCode ='02' then '3' end as flag,--这三个机构按顺序排 --在最前面

  --下面行转列

  sum(case when warnLightType ='0' then lightNum else 0 end) redLight ,--红灯

  sum(case when warnLightType ='1' then lightNum else 0 end) yellowLight --黄灯

  from  (

 

 

select 

  xx.dept_code deptCode,

  xx.dept_name deptName,

  yy.warnLightType warnLightType,

  count(yy.warnLightType) lightNum

  from 

   select  

  deptName,

  deptCode,

  warnLightType

from 

 

  ......省略

  ) yy  right join ims_dept_define xx on xx.dept_code = yy.deptCode  -- 用右连接,如果左边结果表没数据,也会把机构表的机构    --全部显示出来

group by  xx.dept_code ,xx.dept_name,yy.warnLightType   --按这几个分组,求机构下的亮灯数,可能存在两行机构一样,但一行是黄灯数,一行是红灯数,所以就要用到行传列了

 

) kk group by kk.deptCode,kk.deptName order by flag,redLight desc,yellowLight desc  --先按flag排序,把那三个机构排前面

 

二,java代码

//工具方法

private void converDeptLights(List lights ,List

//把list转换map,机构code为key,自身对象为value   

Map map = lights.stream().collect(Collectors.toMap(EarlywarningOverviewDeptLightsResp::getDeptCode,light->light));

for(String deptCode:deptCodes){

  if(!map.containsKey(deptCode)){

    //不包含。则补数据为0

   lights.add(EarlywarningOverviewDeptLightsResp.builder().deptCode(deptCode).redLight("0").yellowLight("0").build());

  }

}

//排序

总机构code=2排第一;01排第二;02排第三;剩下的机构先按红灯数降序排列,再按黄灯数降序排列

Collections.sort(lights,new Comparator(){

  @override

  public int compare(EarlywarningOverviewDeptLightsResp o1,EarlywarningOverviewDeptLightsResp o2){

   if(!"2".equals(o1.getDeptCode())&&"2".equals(o2.getDeptCode())){

     return 1;

   }

 

if(!"01".equals(o1.getDeptCode())&&"01".equals(o2.getDeptCode())){

     return 1;

   }

if(!"02".equals(o1.getDeptCode())&&"02".equals(o2.getDeptCode())){

     return 1;

   }

//红灯有三种情况

if(!"0".equals(o1.getRedLight())&&!"0".equals(o2.getRedLight())){

  return Integer.parseInt(o2.getRedLight()) - Integer.parseInt(o1.getRedLight());//降序

}

if(!"0".equals(o1.getRedLight())&&"0".equals(o2.getRedLight())){

  return -1;

}

if("0".equals(o1.getRedLight())&&!"0".equals(o2.getRedLight())){

  return 1;

}

return return Integer.parseInt(o2.getYellowLight()) - Integer.parseInt(o1.getYellowLight());//最后按黄灯降序

 

  }

 

  };)

}

 

 

 

      

你可能感兴趣的:(java)