java代码或者sql实现行转列

有这样的数据结构:

机构code 预警亮灯灯类型(0:红 1:黄) 灯数量 201 0 60 201 1 70 202 0 80 203 1 90

要转换为下面结构:

机构code 红灯数量 黄灯数量 201 60 70 202 80 0 203 0 90

开始我想用java代码实现,

一、java循环实现

看到这个我自然想到了自身嵌套for循环,后来发现明显不行,

为201有两个,遍历过后还是两个;

然后我想这把这个按灯分成两个数组(用Lamda)

第一个数组:图一 1、3行 红灯 list

第二个数组:图一 2、4行 黄灯 list1

伪代码:

for(int i =0;i<list.size();i++){

//count属性就是存放图一的亮灯数,现在按需求把红灯放入属性red,把黄灯放到属性yellow

//红灯list 的count值肯定是红灯的

list1.get(i).setRed(list.get(i).getCount());

for(int j=0;j < list1.size(); j++){

if(list.get(i).getCode.equals(list1.get(j).getCode)){

//code一样的时候,则把黄灯list1的对象属性count赋予红灯list 的属性yellow

list.get(i).setYellow(list1.get(j).getCount());

//然后把这个相等的黄灯对象删掉

list1.remove(j);

j--; //删除要加--,不然下标越界异常

continue;

}

}

}

//上面for循环结束

//黄灯list1删除调和红灯list一样的code对象后,在把自己的count赋予自己的yellow字段

list1.forEach(a->a.setYellow(a.getCount));

//把list1加入到list

list.addAll(list1);

//判断灯为null的话等于0

list.forEach(a->{

if(StringUtil.isEmpty(a.getRed())){

a.setRed("0");

}

if(StringUtil.isEmpty(a.getYellow())){

a.setYellow("0")

}

});

return list;

二、Lamda分组函数实现

比如图一的对象集合 为List<Light> list = ......

List<Light> listResult = ..... //最终返回的结果集合

//直接按机构code分组

Map<String,List<Light>> collect = list.stream().collect(Collectors.groupingBy(Light::getCode));

//遍历collect

for(Map.Entry<String.List<Light>> entry:collect.entrySet()){

String key = entry.getKey();//key就是机构code

List<Light> listLight = entry.getValue(); //这个比如201对应的是图一201的两个对象的集合

Light r = new Light();

r.setCode(key);

for(Light light:listLight){

if("0".equals(light.getLight())){ //是红灯的话,把count赋值于Red字段

r.setRed(light.getCount());

}

if("1".equals(light.getLight())){ //是黄灯的话,把count赋值于Yellow字段

r.setYellow(light.getCount());

}

}

if(null==r.getRed()){

r.setRed("0");

}

if(null==r.getYellow()){

r.setYellow("0");

}

listResult .add(r);

}

三、sql实现行转列

select

code,

sum(case lightType when 0 then count else 0 end) 红灯,

-- lightType 灯类型 0:红灯 1:黄灯 count:机构下的红灯或者黄灯个数

sum(case lightType when 1 then count else 0 end ) 黄灯

from (

......

) group by code

经验分享 程序员 微信小程序 职场和发展