java代码或者sql实现行转列
有这样的数据结构:
要转换为下面结构:
开始我想用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
