|
@@ -4,11 +4,12 @@ import com.google.common.base.CaseFormat;
|
|
import com.zanxiang.game.data.serve.component.DataPowerComponent;
|
|
import com.zanxiang.game.data.serve.component.DataPowerComponent;
|
|
import com.zanxiang.game.data.serve.pojo.dto.GameServerDayDTO;
|
|
import com.zanxiang.game.data.serve.pojo.dto.GameServerDayDTO;
|
|
import com.zanxiang.game.data.serve.pojo.dto.GameServerDayTotalDTO;
|
|
import com.zanxiang.game.data.serve.pojo.dto.GameServerDayTotalDTO;
|
|
|
|
+import com.zanxiang.game.data.serve.pojo.dto.GameServerSumDayDTO;
|
|
|
|
+import com.zanxiang.game.data.serve.pojo.dto.GameServerSumDayTotalDTO;
|
|
import com.zanxiang.game.data.serve.pojo.entity.AdsGameServerDay;
|
|
import com.zanxiang.game.data.serve.pojo.entity.AdsGameServerDay;
|
|
|
|
+import com.zanxiang.game.data.serve.pojo.entity.AdsGameServerSumDay;
|
|
import com.zanxiang.game.data.serve.pojo.enums.OrderByEnum;
|
|
import com.zanxiang.game.data.serve.pojo.enums.OrderByEnum;
|
|
-import com.zanxiang.game.data.serve.pojo.vo.GameServerDayTotalVO;
|
|
|
|
-import com.zanxiang.game.data.serve.pojo.vo.GameServerDayVO;
|
|
|
|
-import com.zanxiang.game.data.serve.pojo.vo.GameServerTrendVO;
|
|
|
|
|
|
+import com.zanxiang.game.data.serve.pojo.vo.*;
|
|
import com.zanxiang.game.data.serve.service.IGameServerService;
|
|
import com.zanxiang.game.data.serve.service.IGameServerService;
|
|
import com.zanxiang.game.data.serve.utils.Page;
|
|
import com.zanxiang.game.data.serve.utils.Page;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
@@ -44,6 +45,8 @@ public class GameServerServiceImpl implements IGameServerService {
|
|
//存储映射的List
|
|
//存储映射的List
|
|
private static final List<Tuple2<Field,Field>> dayNFieldMapList;
|
|
private static final List<Tuple2<Field,Field>> dayNFieldMapList;
|
|
private static final List<Tuple2<Field,Field>> dayNTotalFieldMapList;
|
|
private static final List<Tuple2<Field,Field>> dayNTotalFieldMapList;
|
|
|
|
+ private static final List<Tuple2<Field,Field>> dayNFieldMapListForServerDay;
|
|
|
|
+ private static final List<Tuple2<Field,Field>> dayNTotalFieldMapListForServerDay;
|
|
|
|
|
|
static {
|
|
static {
|
|
//解析游戏区服的dayN映射
|
|
//解析游戏区服的dayN映射
|
|
@@ -113,6 +116,75 @@ public class GameServerServiceImpl implements IGameServerService {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ //解析游戏区服每日的dayN映射
|
|
|
|
+ Map<String, Field> fieldMapDay = new HashMap<>();
|
|
|
|
+ List<Field> dayNFieldListForServerDay = new ArrayList<>();
|
|
|
|
+ Class<?> tempClazzForServerDay = GameServerSumDayVO.class;
|
|
|
|
+ while (tempClazzForServerDay != null) {
|
|
|
|
+ //得到所有的field
|
|
|
|
+ Field[] fields = tempClazzForServerDay.getDeclaredFields();
|
|
|
|
+ for (Field field : fields) {
|
|
|
|
+ if (Modifier.isFinal(field.getModifiers()) || Modifier.isStatic(field.getModifiers())) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ //map里面存储了所有的field
|
|
|
|
+ fieldMapDay.put(field.getName(), field);
|
|
|
|
+ if (field.getType() == GameServerTrendVO.class) {
|
|
|
|
+ //list里面只存储了 Trend 相关的field
|
|
|
|
+ dayNFieldListForServerDay.add(field);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ tempClazzForServerDay = tempClazzForServerDay.getSuperclass();
|
|
|
|
+ }
|
|
|
|
+ if (dayNFieldListForServerDay.isEmpty()) {
|
|
|
|
+ dayNFieldMapListForServerDay = Collections.emptyList();
|
|
|
|
+ } else {
|
|
|
|
+ dayNFieldMapListForServerDay = new ArrayList<>(dayNFieldListForServerDay.size());
|
|
|
|
+ for (Field dayNFieldForServerDay : dayNFieldListForServerDay) {
|
|
|
|
+ dayNFieldForServerDay.setAccessible(true);
|
|
|
|
+ Field sourceField = fieldMapDay.get(dayNFieldForServerDay.getName().replace("Trend", ""));
|
|
|
|
+ sourceField.setAccessible(true);
|
|
|
|
+ if (sourceField != null) {
|
|
|
|
+ dayNFieldMapListForServerDay.add(Tuples.of(sourceField, dayNFieldForServerDay));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //游戏区服每日总计dayN映射
|
|
|
|
+ Map<String, Field> fieldTotalMapDay = new HashMap<>();
|
|
|
|
+ List<Field> dayNTotalFieldListForServerDay = new ArrayList<>();
|
|
|
|
+ Class<?> tempTotalClazzForServerDay = GameServerSumDayTotalVO.class;
|
|
|
|
+ while (tempTotalClazzForServerDay != null) {
|
|
|
|
+ //得到所有的field
|
|
|
|
+ Field[] fields = tempTotalClazzForServerDay.getDeclaredFields();
|
|
|
|
+ for (Field field : fields) {
|
|
|
|
+ if (Modifier.isFinal(field.getModifiers()) || Modifier.isStatic(field.getModifiers())) {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ //map里面存储了所有的field
|
|
|
|
+ fieldTotalMapDay.put(field.getName(), field);
|
|
|
|
+ if (field.getType() == GameServerTrendVO.class) {
|
|
|
|
+ //list里面只存储了 Trend 相关的field
|
|
|
|
+ dayNTotalFieldListForServerDay.add(field);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ tempTotalClazzForServerDay = tempTotalClazzForServerDay.getSuperclass();
|
|
|
|
+ }
|
|
|
|
+ if (dayNTotalFieldListForServerDay.isEmpty()) {
|
|
|
|
+ dayNTotalFieldMapListForServerDay = Collections.emptyList();
|
|
|
|
+ } else {
|
|
|
|
+ dayNTotalFieldMapListForServerDay = new ArrayList<>(dayNTotalFieldListForServerDay.size());
|
|
|
|
+ for (Field dayNTotalFieldForServerDay : dayNTotalFieldListForServerDay) {
|
|
|
|
+ dayNTotalFieldForServerDay.setAccessible(true);
|
|
|
|
+ Field sourceField = fieldTotalMapDay.get(dayNTotalFieldForServerDay.getName().replace("Trend", ""));
|
|
|
|
+ sourceField.setAccessible(true);
|
|
|
|
+ if (sourceField != null) {
|
|
|
|
+ dayNTotalFieldMapListForServerDay.add(Tuples.of(sourceField, dayNTotalFieldForServerDay));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
@@ -237,6 +309,111 @@ public class GameServerServiceImpl implements IGameServerService {
|
|
return vo;
|
|
return vo;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 游戏区服每日数据
|
|
|
|
+ * @param dto GameServerSumDayDTO
|
|
|
|
+ * @return Page<GameServerSumDayVO>
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public Page<GameServerSumDayVO> getGameServerDataSumDay(GameServerSumDayDTO dto) {
|
|
|
|
+ //添加权限
|
|
|
|
+ /*com.github.sd4324530.jtuple.Tuple2<List<Long>, List<Long>> poerInfo = dataPowerComponent.getPowerInfo();
|
|
|
|
+ List<Long> gameIds = dto.getGameId() == null ? poerInfo.second : Collections.singletonList(dto.getGameId());*/
|
|
|
|
+ //创建查询条件
|
|
|
|
+ Criteria cri = Cnd.cri();
|
|
|
|
+ /*if (gameIds != null) {
|
|
|
|
+ //拼接游戏ID查询条件
|
|
|
|
+ cri.where().andInList("game_id", gameIds);
|
|
|
|
+ }*/
|
|
|
|
+ if (dto.getGameId() != null) {
|
|
|
|
+ //拼接游戏ID查询条件
|
|
|
|
+ cri.where().andEquals("game_id", dto.getGameId());
|
|
|
|
+ }
|
|
|
|
+ if (dto.getBeginDate() != null && dto.getEndDate() != null) {
|
|
|
|
+ //拼接开服时间查询条件
|
|
|
|
+ cri.where().andBetween("dt", dto.getBeginDate(), dto.getEndDate());
|
|
|
|
+ }
|
|
|
|
+ if (StringUtils.isNotBlank(dto.getSourceSystem())) {
|
|
|
|
+ //拼接sdk来源
|
|
|
|
+ cri.where().andEquals("source_system", dto.getSourceSystem());
|
|
|
|
+ }
|
|
|
|
+ //添加排序条件
|
|
|
|
+ //拼接排序条件,如果没有排序条件给默认值
|
|
|
|
+ if (StringUtils.isBlank(dto.getSortType())) {
|
|
|
|
+ dto.setSortType(OrderByEnum.DESC.getOrderType());
|
|
|
|
+ }
|
|
|
|
+ if (StringUtils.isBlank(dto.getSortFiled())) {
|
|
|
|
+ cri.getOrderBy().orderBy("dt", dto.getSortType());
|
|
|
|
+ cri.getOrderBy().orderBy("game_id", dto.getSortType());
|
|
|
|
+ } else {
|
|
|
|
+ cri.getOrderBy().orderBy(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, dto.getSortFiled()), dto.getSortType());
|
|
|
|
+ }
|
|
|
|
+ //创建sql语句查询数据
|
|
|
|
+ Sql sql = Sqls.create(gameServerSumDaySql() + cri);
|
|
|
|
+ //设置自定义回传对象
|
|
|
|
+ sql.setCallback(Sqls.callback.entities());
|
|
|
|
+ sql.setEntity(dao.getEntity(GameServerSumDayVO.class));
|
|
|
|
+ //设置分页对象
|
|
|
|
+ Pager pager = dao.createPager(dto.getPageNum(), dto.getPageSize());
|
|
|
|
+ sql.setPager(pager);
|
|
|
|
+ //执行sql
|
|
|
|
+ dao.execute(sql);
|
|
|
|
+ //设置总记录数
|
|
|
|
+ pager.setRecordCount(dao.count(AdsGameServerSumDay.class, cri));
|
|
|
|
+ List<GameServerSumDayVO> tempList = sql.getList(GameServerSumDayVO.class);
|
|
|
|
+ List<GameServerSumDayVO> list = tempList.stream().map(vo -> {
|
|
|
|
+ formatDayNForServerDay(vo);
|
|
|
|
+ return vo;
|
|
|
|
+ }).collect(Collectors.toList());
|
|
|
|
+ //返回结果
|
|
|
|
+ return new Page<>(list, pager);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 游戏区服每日数据总计
|
|
|
|
+ * @param dto GameServerSumDayTotalDTO
|
|
|
|
+ * @return GameServerSumDayTotalVO
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public GameServerSumDayTotalVO getGameServerDataSumDayTotal(GameServerSumDayTotalDTO dto) {
|
|
|
|
+ /*com.github.sd4324530.jtuple.Tuple2<List<Long>, List<Long>> poerInfo = dataPowerComponent.getPowerInfo();
|
|
|
|
+ List<Long> gameIds = dto.getGameId() == null ? poerInfo.second : Collections.singletonList(dto.getGameId());*/
|
|
|
|
+
|
|
|
|
+ //创建查询条件
|
|
|
|
+ Criteria cri = Cnd.cri();
|
|
|
|
+ /*if (gameIds != null) {
|
|
|
|
+ //拼接游戏ID查询条件
|
|
|
|
+ cri.where().andInList("game_id", gameIds);
|
|
|
|
+ }*/
|
|
|
|
+ if (dto.getGameId() != null) {
|
|
|
|
+ //拼接游戏ID查询条件
|
|
|
|
+ cri.where().andEquals("game_id", dto.getGameId());
|
|
|
|
+ }
|
|
|
|
+ if (dto.getBeginDate() != null && dto.getEndDate() != null) {
|
|
|
|
+ //拼接开服时间查询条件
|
|
|
|
+ cri.where().andBetween("dt", dto.getBeginDate(), dto.getEndDate());
|
|
|
|
+ }
|
|
|
|
+ if (StringUtils.isNotBlank(dto.getSourceSystem())) {
|
|
|
|
+ //拼接sdk来源
|
|
|
|
+ cri.where().andEquals("source_system", dto.getSourceSystem());
|
|
|
|
+ }
|
|
|
|
+ //创建sql语句查询数据
|
|
|
|
+ Sql sql = Sqls.create(gameServerSumDayTotalSql() + cri);
|
|
|
|
+ //设置自定义回传对象
|
|
|
|
+ sql.setCallback(Sqls.callback.entity());
|
|
|
|
+ sql.setEntity(dao.getEntity(GameServerSumDayTotalVO.class));
|
|
|
|
+ //执行sql
|
|
|
|
+ dao.execute(sql);
|
|
|
|
+ //得到查询的结果
|
|
|
|
+ GameServerSumDayTotalVO vo = sql.getObject(GameServerSumDayTotalVO.class);
|
|
|
|
+ if (StringUtils.isNotBlank(vo.getDa1())) {
|
|
|
|
+ formatTotalDayNForServerDay(vo);
|
|
|
|
+ }
|
|
|
|
+ //返回结果
|
|
|
|
+ return vo;
|
|
|
|
+ }
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* 将vo中的原始String数据修改为一个对象
|
|
* 将vo中的原始String数据修改为一个对象
|
|
* @param vo 展示给前端的游戏区服数据
|
|
* @param vo 展示给前端的游戏区服数据
|
|
@@ -279,6 +456,36 @@ public class GameServerServiceImpl implements IGameServerService {
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 将vo中的原始String数据修改为一个对象(游戏区服每日数据)
|
|
|
|
+ * @param vo 展示给前端的游戏区服每日数据
|
|
|
|
+ */
|
|
|
|
+ private void formatDayNForServerDay(GameServerSumDayVO vo) {
|
|
|
|
+ if (CollectionUtils.isEmpty(dayNFieldMapListForServerDay)) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ dayNFieldMapListForServerDay.forEach(dayNFieldMapForServerDay -> {
|
|
|
|
+ try {
|
|
|
|
+ String[] temps = ((String) dayNFieldMapForServerDay.getT1().get(vo)).split("/");
|
|
|
|
+ dayNFieldMapForServerDay.getT2().set(vo, GameServerTrendVO.builder()
|
|
|
|
+ .regNum(Long.parseLong(temps[0]))
|
|
|
|
+ .roleNum(Long.parseLong(temps[1]))
|
|
|
|
+ .activeNum(Long.parseLong(temps[2]))
|
|
|
|
+ .amountNum(Long.parseLong(temps[3]))
|
|
|
|
+ .amount(new BigDecimal(temps[4]))
|
|
|
|
+ .rollServerNum(Long.parseLong(temps[5]))
|
|
|
|
+ .rollServerAmountNum(Long.parseLong(temps[6]))
|
|
|
|
+ .rollServerAmount(new BigDecimal(temps[7]))
|
|
|
|
+ .rollServerAmountRate(new BigDecimal(temps[8]))
|
|
|
|
+ .build()
|
|
|
|
+ );
|
|
|
|
+ } catch (IllegalAccessException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* 将vo中的原始String数据修改为一个对象
|
|
* 将vo中的原始String数据修改为一个对象
|
|
* @param vo 展示给前端的游戏区服数据总计
|
|
* @param vo 展示给前端的游戏区服数据总计
|
|
@@ -383,144 +590,39 @@ public class GameServerServiceImpl implements IGameServerService {
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * 计算总计一栏的daN数据
|
|
|
|
- * 注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/ (游戏区服数据)
|
|
|
|
- * DayN活跃人数/ (注册留存数据)/ 注册人数(去除时间未到的数据)
|
|
|
|
- * 第N天的新增付费用户/第N天的老活跃用户/第N天的累计付费用户/第N天的累计活跃用户/ (付费留存数据)
|
|
|
|
- * 第N天的新增创角用户/第N天的老活跃用户/第N天的累计创角用户/第N天的累计活跃用户/ (创角留存数据)
|
|
|
|
|
|
+ * 将vo中的原始String数据修改为一个对象
|
|
|
|
+ * @param vo 展示给前端的游戏区服每日数据总计
|
|
*/
|
|
*/
|
|
- private String trendDay() {
|
|
|
|
- StringBuilder daySql = new StringBuilder(StringUtils.EMPTY);
|
|
|
|
- //拼接da1-da90 sql
|
|
|
|
- for (int i = 1; i <= 90; i++) {
|
|
|
|
- daySql.append("""
|
|
|
|
- CONCAT(
|
|
|
|
- SUM(SPLIT_PART(da%s, '/', 1)), '/',
|
|
|
|
- SUM(SPLIT_PART(da%s, '/', 2)), '/',
|
|
|
|
- SUM(SPLIT_PART(da%s, '/', 3)), '/',
|
|
|
|
- SUM(SPLIT_PART(da%s, '/', 4)), '/',
|
|
|
|
- SUM(SPLIT_PART(da%s, '/', 5)), '/',
|
|
|
|
- SUM(SPLIT_PART(da%s, '/', 6)), '/',
|
|
|
|
- SUM(SPLIT_PART(da%s, '/', 7)), '/',
|
|
|
|
- SUM(SPLIT_PART(da%s, '/', 8)), '/',
|
|
|
|
- SUM(SPLIT_PART(da%s, '/', 10)), '/',
|
|
|
|
- SUM(IF(DATE_ADD(dt, INTERVAL %s day) <= Local.now(), total_reg_num, 0)), '/',
|
|
|
|
- SUM(SPLIT_PART(da%s, '/', 12)), '/',
|
|
|
|
- SUM(SPLIT_PART(da%s, '/', 13)), '/',
|
|
|
|
- SUM(IF(DATE_ADD(dt, INTERVAL %s day) <= Local.now(), SPLIT_PART(da%s, '/', 14), 0)), '/',
|
|
|
|
- SUM(IF(DATE_ADD(dt, INTERVAL %s day) <= Local.now(), SPLIT_PART(da%s, '/', 15), 0))
|
|
|
|
- ) as da%s ,
|
|
|
|
- """.formatted(i, i, i, i, i, i, i, i, i, i-1,i ,i, i-1, i, i-1, i, i ));
|
|
|
|
- }
|
|
|
|
- //拼接m4-m12 sql
|
|
|
|
- for (int i = 4; i <= 12; i++) {
|
|
|
|
- daySql.append("""
|
|
|
|
- CONCAT(
|
|
|
|
- SUM(SPLIT_PART(m%s, '/', 1)), '/',
|
|
|
|
- SUM(SPLIT_PART(m%s, '/', 2)), '/',
|
|
|
|
- SUM(SPLIT_PART(m%s, '/', 3)), '/',
|
|
|
|
- SUM(SPLIT_PART(m%s, '/', 4)), '/',
|
|
|
|
- SUM(SPLIT_PART(m%s, '/', 5)), '/',
|
|
|
|
- SUM(SPLIT_PART(m%s, '/', 6)), '/',
|
|
|
|
- SUM(SPLIT_PART(m%s, '/', 7)), '/',
|
|
|
|
- SUM(SPLIT_PART(m%s, '/', 8)), '/',
|
|
|
|
- SUM(SPLIT_PART(m%s, '/', 10)), '/',
|
|
|
|
- SUM(IF(DATE_ADD(dt, INTERVAL %s month) <= Local.now(), total_reg_num, 0)), '/',
|
|
|
|
- SUM(SPLIT_PART(m%s, '/', 12)), '/',
|
|
|
|
- SUM(SPLIT_PART(m%s, '/', 13)), '/',
|
|
|
|
- SUM(IF(DATE_ADD(dt, INTERVAL %s month) <= Local.now(), SPLIT_PART(m%s, '/', 14), 0)), '/',
|
|
|
|
- SUM(IF(DATE_ADD(dt, INTERVAL %s month) <= Local.now(), SPLIT_PART(m%s, '/', 15), 0))
|
|
|
|
- ) as m%s ,
|
|
|
|
- """.formatted(i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i));
|
|
|
|
- }
|
|
|
|
- //拼接total
|
|
|
|
- daySql.append("""
|
|
|
|
- CONCAT(
|
|
|
|
- SUM(SPLIT_PART(total, '/', 1)), '/',
|
|
|
|
- SUM(SPLIT_PART(total, '/', 2)), '/',
|
|
|
|
- SUM(SPLIT_PART(total, '/', 3)), '/',
|
|
|
|
- SUM(SPLIT_PART(total, '/', 4)), '/',
|
|
|
|
- SUM(SPLIT_PART(total, '/', 5)), '/',
|
|
|
|
- SUM(SPLIT_PART(total, '/', 6)), '/',
|
|
|
|
- SUM(SPLIT_PART(total, '/', 7)), '/',
|
|
|
|
- SUM(SPLIT_PART(total, '/', 8)), '/',
|
|
|
|
- SUM(SPLIT_PART(total, '/', 10)), '/',
|
|
|
|
- SUM(total_reg_num), '/',
|
|
|
|
- SUM(SPLIT_PART(total, '/', 12)), '/',
|
|
|
|
- SUM(SPLIT_PART(total, '/', 13)), '/',
|
|
|
|
- SUM(SPLIT_PART(total, '/', 14)), '/',
|
|
|
|
- SUM(SPLIT_PART(total, '/', 15))
|
|
|
|
- ) as total
|
|
|
|
- """);
|
|
|
|
-
|
|
|
|
- return daySql.toString();
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- private String trendDayDemo1() {
|
|
|
|
- StringBuilder daySql = new StringBuilder(StringUtils.EMPTY);
|
|
|
|
- //拼接da1-da90 sql
|
|
|
|
- for (int i = 1; i <= 90; i++) {
|
|
|
|
- daySql.append("""
|
|
|
|
- CONCAT(
|
|
|
|
- SUM(da%s[1]), '/',
|
|
|
|
- SUM(da%s[2]), '/',
|
|
|
|
- SUM(da%s[3]), '/',
|
|
|
|
- SUM(da%s[4]), '/',
|
|
|
|
- SUM(da%s[5]), '/',
|
|
|
|
- SUM(da%s[6]), '/',
|
|
|
|
- SUM(da%s[7]), '/',
|
|
|
|
- SUM(da%s[8]), '/',
|
|
|
|
- SUM(da%s[10]), '/',
|
|
|
|
- SUM(IF(DATE_ADD(dt, INTERVAL %s day) <= Local.now(), total_reg_num, 0)), '/',
|
|
|
|
- SUM(da%s[12]), '/',
|
|
|
|
- SUM(da%s[13]), '/',
|
|
|
|
- SUM(IF(DATE_ADD(dt, INTERVAL %s day) <= Local.now(), da%s[14], 0)), '/',
|
|
|
|
- SUM(IF(DATE_ADD(dt, INTERVAL %s day) <= Local.now(), da%s[15], 0))
|
|
|
|
- ) as da%s ,
|
|
|
|
- """.formatted(i, i, i, i, i, i, i, i, i, i-1,i ,i, i-1, i, i-1, i, i ));
|
|
|
|
- }
|
|
|
|
- //拼接m4-m12 sql
|
|
|
|
- for (int i = 4; i <= 12; i++) {
|
|
|
|
- daySql.append("""
|
|
|
|
- CONCAT(
|
|
|
|
- SUM(m%s[1]), '/',
|
|
|
|
- SUM(m%s[2]), '/',
|
|
|
|
- SUM(m%s[3]), '/',
|
|
|
|
- SUM(m%s[4]), '/',
|
|
|
|
- SUM(m%s[5]), '/',
|
|
|
|
- SUM(m%s[6]), '/',
|
|
|
|
- SUM(m%s[7]), '/',
|
|
|
|
- SUM(m%s[8]), '/',
|
|
|
|
- SUM(m%s[10]), '/',
|
|
|
|
- SUM(IF(DATE_ADD(dt, INTERVAL %s month) <= Local.now(), total_reg_num, 0)), '/',
|
|
|
|
- SUM(m%s[12]), '/',
|
|
|
|
- SUM(m%s[13]), '/',
|
|
|
|
- SUM(IF(DATE_ADD(dt, INTERVAL %s month) <= Local.now(), m%s[14], 0)), '/',
|
|
|
|
- SUM(IF(DATE_ADD(dt, INTERVAL %s month) <= Local.now(), m%s[15], 0))
|
|
|
|
- ) as m%s ,
|
|
|
|
- """.formatted(i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i));
|
|
|
|
|
|
+ private void formatTotalDayNForServerDay(GameServerSumDayTotalVO vo) {
|
|
|
|
+ if (CollectionUtils.isEmpty(dayNTotalFieldMapListForServerDay)) {
|
|
|
|
+ return;
|
|
}
|
|
}
|
|
- //拼接total
|
|
|
|
- daySql.append("""
|
|
|
|
- CONCAT(
|
|
|
|
- SUM(total[1]), '/',
|
|
|
|
- SUM(total[2]), '/',
|
|
|
|
- SUM(total[3]), '/',
|
|
|
|
- SUM(total[4]), '/',
|
|
|
|
- SUM(total[5]), '/',
|
|
|
|
- SUM(total[6]), '/',
|
|
|
|
- SUM(total[7]), '/',
|
|
|
|
- SUM(total[8]), '/',
|
|
|
|
- SUM(total[10]), '/',
|
|
|
|
- SUM(total_reg_num), '/',
|
|
|
|
- SUM(total[12]), '/',
|
|
|
|
- SUM(total[13]), '/',
|
|
|
|
- SUM(total[14]), '/',
|
|
|
|
- SUM(total[15])
|
|
|
|
- ) as total
|
|
|
|
- """);
|
|
|
|
|
|
+ dayNTotalFieldMapListForServerDay.forEach(dayNTotalFieldMap -> {
|
|
|
|
+ try {
|
|
|
|
+ /*注册人数0/创角人数1/活跃人数2/付费人数3/付费金额4/滚服人数5/滚服付费人数6/滚服付费金额7/ (游戏区服数据)*/
|
|
|
|
+ String[] temps = ((String) dayNTotalFieldMap.getT1().get(vo)).split("/");
|
|
|
|
+ //付费金额
|
|
|
|
+ BigDecimal amount = new BigDecimal(temps[4]);
|
|
|
|
+ //滚服付费金额
|
|
|
|
+ BigDecimal rollServerAmount = new BigDecimal(temps[7]);
|
|
|
|
+ //设置trend对象
|
|
|
|
+ dayNTotalFieldMap.getT2().set(vo, GameServerTrendVO.builder()
|
|
|
|
+ .regNum(Long.parseLong(temps[0]))
|
|
|
|
+ .roleNum(Long.parseLong(temps[1]))
|
|
|
|
+ .activeNum(Long.parseLong(temps[2]))
|
|
|
|
+ .amountNum(Long.parseLong(temps[3]))
|
|
|
|
+ .amount(amount)
|
|
|
|
+ .rollServerNum(Long.parseLong(temps[5]))
|
|
|
|
+ .rollServerAmountNum(Long.parseLong(temps[6]))
|
|
|
|
+ .rollServerAmount(rollServerAmount)
|
|
|
|
+ .rollServerAmountRate(amount.compareTo(BigDecimal.ZERO) == 0 ? BigDecimal.ZERO :
|
|
|
|
+ rollServerAmount.divide(amount, 4, RoundingMode.HALF_UP))
|
|
|
|
+ .build());
|
|
|
|
+ } catch (IllegalAccessException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
|
|
- return daySql.toString();
|
|
|
|
|
|
+ });
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -533,7 +635,7 @@ public class GameServerServiceImpl implements IGameServerService {
|
|
*
|
|
*
|
|
* @return String
|
|
* @return String
|
|
*/
|
|
*/
|
|
- private String trendDayDemo2(String activeType) {
|
|
|
|
|
|
+ private String trendDay(String activeType) {
|
|
StringBuilder daySql = new StringBuilder(StringUtils.EMPTY);
|
|
StringBuilder daySql = new StringBuilder(StringUtils.EMPTY);
|
|
//注册留存数据
|
|
//注册留存数据
|
|
if ("reg".equals(activeType)) {
|
|
if ("reg".equals(activeType)) {
|
|
@@ -706,27 +808,80 @@ public class GameServerServiceImpl implements IGameServerService {
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * 游戏区服数据SQL
|
|
|
|
- * @return String
|
|
|
|
|
|
+ * 计算总计一栏的daN数据(游戏区服每日总计)
|
|
|
|
+ * 注册人数/创角人数/活跃人数/付费人数/付费金额/滚服人数/滚服付费人数/滚服付费金额/ (游戏区服数据)
|
|
*/
|
|
*/
|
|
- private String gameServerDaySql() {
|
|
|
|
- return """
|
|
|
|
- SELECT
|
|
|
|
- dt,
|
|
|
|
- source_system,
|
|
|
|
- server_id,
|
|
|
|
- server_name,
|
|
|
|
- game_id,
|
|
|
|
- game_name,
|
|
|
|
- classify,
|
|
|
|
- out_total_num,
|
|
|
|
- out_total_amount_num,
|
|
|
|
- out_total_amount,
|
|
|
|
- out_total_rate,
|
|
|
|
- total_role_num,
|
|
|
|
- total_reg_num,
|
|
|
|
- total_amount_num,
|
|
|
|
- total_amount,
|
|
|
|
|
|
+ private String trendDayForServerDay() {
|
|
|
|
+ StringBuilder daySql = new StringBuilder(StringUtils.EMPTY);
|
|
|
|
+ //拼接da1-da90 sql
|
|
|
|
+ for (int i = 1; i <= 90; i++) {
|
|
|
|
+ daySql.append("""
|
|
|
|
+ CONCAT(
|
|
|
|
+ SUM(da%s[1]), '/',
|
|
|
|
+ SUM(da%s[2]), '/',
|
|
|
|
+ SUM(da%s[3]), '/',
|
|
|
|
+ SUM(da%s[4]), '/',
|
|
|
|
+ SUM(da%s[5]), '/',
|
|
|
|
+ SUM(da%s[6]), '/',
|
|
|
|
+ SUM(da%s[7]), '/',
|
|
|
|
+ SUM(da%s[8])
|
|
|
|
+ ) as da%s ,
|
|
|
|
+ """.formatted(i, i, i, i, i, i, i, i, i));
|
|
|
|
+ }
|
|
|
|
+ //拼接m4-m12 sql
|
|
|
|
+ for (int i = 4; i <= 12; i++) {
|
|
|
|
+ daySql.append("""
|
|
|
|
+ CONCAT(
|
|
|
|
+ SUM(m%s[1]), '/',
|
|
|
|
+ SUM(m%s[2]), '/',
|
|
|
|
+ SUM(m%s[3]), '/',
|
|
|
|
+ SUM(m%s[4]), '/',
|
|
|
|
+ SUM(m%s[5]), '/',
|
|
|
|
+ SUM(m%s[6]), '/',
|
|
|
|
+ SUM(m%s[7]), '/',
|
|
|
|
+ SUM(m%s[8])
|
|
|
|
+ ) as m%s ,
|
|
|
|
+ """.formatted(i, i, i, i, i, i, i, i, i));
|
|
|
|
+ }
|
|
|
|
+ //拼接total
|
|
|
|
+ daySql.append("""
|
|
|
|
+ CONCAT(
|
|
|
|
+ SUM(total[1]), '/',
|
|
|
|
+ SUM(total[2]), '/',
|
|
|
|
+ SUM(total[3]), '/',
|
|
|
|
+ SUM(total[4]), '/',
|
|
|
|
+ SUM(total[5]), '/',
|
|
|
|
+ SUM(total[6]), '/',
|
|
|
|
+ SUM(total[7]), '/',
|
|
|
|
+ SUM(total[8])
|
|
|
|
+ ) as total
|
|
|
|
+ """);
|
|
|
|
+
|
|
|
|
+ return daySql.toString();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 游戏区服数据SQL
|
|
|
|
+ * @return String
|
|
|
|
+ */
|
|
|
|
+ private String gameServerDaySql() {
|
|
|
|
+ return """
|
|
|
|
+ SELECT
|
|
|
|
+ dt,
|
|
|
|
+ source_system,
|
|
|
|
+ server_id,
|
|
|
|
+ server_name,
|
|
|
|
+ game_id,
|
|
|
|
+ game_name,
|
|
|
|
+ classify,
|
|
|
|
+ out_total_num,
|
|
|
|
+ out_total_amount_num,
|
|
|
|
+ out_total_amount,
|
|
|
|
+ out_total_rate,
|
|
|
|
+ total_role_num,
|
|
|
|
+ total_reg_num,
|
|
|
|
+ total_amount_num,
|
|
|
|
+ total_amount,
|
|
da1,
|
|
da1,
|
|
da2,
|
|
da2,
|
|
da3,
|
|
da3,
|
|
@@ -832,6 +987,134 @@ public class GameServerServiceImpl implements IGameServerService {
|
|
""";
|
|
""";
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 游戏区服每日数据SQL
|
|
|
|
+ * @return String
|
|
|
|
+ */
|
|
|
|
+ private String gameServerSumDaySql() {
|
|
|
|
+ return """
|
|
|
|
+ SELECT
|
|
|
|
+ id,
|
|
|
|
+ dt,
|
|
|
|
+ source_system,
|
|
|
|
+ server_id,
|
|
|
|
+ server_name,
|
|
|
|
+ game_id,
|
|
|
|
+ game_name,
|
|
|
|
+ classify,
|
|
|
|
+ out_total_num,
|
|
|
|
+ out_total_amount_num,
|
|
|
|
+ out_total_amount,
|
|
|
|
+ out_total_rate,
|
|
|
|
+ total_role_num,
|
|
|
|
+ total_reg_num,
|
|
|
|
+ total_amount_num,
|
|
|
|
+ total_amount,
|
|
|
|
+ da1,
|
|
|
|
+ da2,
|
|
|
|
+ da3,
|
|
|
|
+ da4,
|
|
|
|
+ da5,
|
|
|
|
+ da6,
|
|
|
|
+ da7,
|
|
|
|
+ da8,
|
|
|
|
+ da9,
|
|
|
|
+ da10,
|
|
|
|
+ da11,
|
|
|
|
+ da12,
|
|
|
|
+ da13,
|
|
|
|
+ da14,
|
|
|
|
+ da15,
|
|
|
|
+ da16,
|
|
|
|
+ da17,
|
|
|
|
+ da18,
|
|
|
|
+ da19,
|
|
|
|
+ da20,
|
|
|
|
+ da21,
|
|
|
|
+ da22,
|
|
|
|
+ da23,
|
|
|
|
+ da24,
|
|
|
|
+ da25,
|
|
|
|
+ da26,
|
|
|
|
+ da27,
|
|
|
|
+ da28,
|
|
|
|
+ da29,
|
|
|
|
+ da30,
|
|
|
|
+ da31,
|
|
|
|
+ da32,
|
|
|
|
+ da33,
|
|
|
|
+ da34,
|
|
|
|
+ da35,
|
|
|
|
+ da36,
|
|
|
|
+ da37,
|
|
|
|
+ da38,
|
|
|
|
+ da39,
|
|
|
|
+ da40,
|
|
|
|
+ da41,
|
|
|
|
+ da42,
|
|
|
|
+ da43,
|
|
|
|
+ da44,
|
|
|
|
+ da45,
|
|
|
|
+ da46,
|
|
|
|
+ da47,
|
|
|
|
+ da48,
|
|
|
|
+ da49,
|
|
|
|
+ da50,
|
|
|
|
+ da51,
|
|
|
|
+ da52,
|
|
|
|
+ da53,
|
|
|
|
+ da54,
|
|
|
|
+ da55,
|
|
|
|
+ da56,
|
|
|
|
+ da57,
|
|
|
|
+ da58,
|
|
|
|
+ da59,
|
|
|
|
+ da60,
|
|
|
|
+ da61,
|
|
|
|
+ da62,
|
|
|
|
+ da63,
|
|
|
|
+ da64,
|
|
|
|
+ da65,
|
|
|
|
+ da66,
|
|
|
|
+ da67,
|
|
|
|
+ da68,
|
|
|
|
+ da69,
|
|
|
|
+ da70,
|
|
|
|
+ da71,
|
|
|
|
+ da72,
|
|
|
|
+ da73,
|
|
|
|
+ da74,
|
|
|
|
+ da75,
|
|
|
|
+ da76,
|
|
|
|
+ da77,
|
|
|
|
+ da78,
|
|
|
|
+ da79,
|
|
|
|
+ da80,
|
|
|
|
+ da81,
|
|
|
|
+ da82,
|
|
|
|
+ da83,
|
|
|
|
+ da84,
|
|
|
|
+ da85,
|
|
|
|
+ da86,
|
|
|
|
+ da87,
|
|
|
|
+ da88,
|
|
|
|
+ da89,
|
|
|
|
+ da90,
|
|
|
|
+ m4,
|
|
|
|
+ m5,
|
|
|
|
+ m6,
|
|
|
|
+ m7,
|
|
|
|
+ m8,
|
|
|
|
+ m9,
|
|
|
|
+ m10,
|
|
|
|
+ m11,
|
|
|
|
+ m12,
|
|
|
|
+ total
|
|
|
|
+ FROM
|
|
|
|
+ game_ads.ads_game_server_day_sum
|
|
|
|
+ """;
|
|
|
|
+ }
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* 游戏区服数据总计SQL
|
|
* 游戏区服数据总计SQL
|
|
* @param activeType 查询的留存类型 reg -> 注册留存 ; role -> 角色留存 ; amount -> 付费留存
|
|
* @param activeType 查询的留存类型 reg -> 注册留存 ; role -> 角色留存 ; amount -> 付费留存
|
|
@@ -849,7 +1132,7 @@ public class GameServerServiceImpl implements IGameServerService {
|
|
IFNULL(SUM(total_reg_num), 0) as total_reg_num,
|
|
IFNULL(SUM(total_reg_num), 0) as total_reg_num,
|
|
IFNULL(SUM(total_amount_num), 0) as total_amount_num,
|
|
IFNULL(SUM(total_amount_num), 0) as total_amount_num,
|
|
IFNULL(SUM(total_amount), 0) as total_amount,
|
|
IFNULL(SUM(total_amount), 0) as total_amount,
|
|
- """ + trendDayDemo2(activeType) +
|
|
|
|
|
|
+ """ + trendDay(activeType) +
|
|
"""
|
|
"""
|
|
FROM (
|
|
FROM (
|
|
SELECT
|
|
SELECT
|
|
@@ -974,5 +1257,146 @@ public class GameServerServiceImpl implements IGameServerService {
|
|
""";
|
|
""";
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 游戏区服每日数据总计SQL
|
|
|
|
+ *
|
|
|
|
+ * @return String
|
|
|
|
+ */
|
|
|
|
+ private String gameServerSumDayTotalSql() {
|
|
|
|
+ return """
|
|
|
|
+ SELECT
|
|
|
|
+ IFNULL(SUM(out_total_num), 0) as out_total_num,
|
|
|
|
+ IFNULL(SUM(out_total_amount_num), 0) as out_total_amount_num,
|
|
|
|
+ IFNULL(SUM(out_total_amount), 0) as out_total_amount,
|
|
|
|
+ ROUND(IF(SUM(total_amount) > 0, SUM(out_total_amount) / SUM(total_amount), 0), 4) as out_total_rate,
|
|
|
|
+ IFNULL(SUM(total_role_num), 0) as total_role_num,
|
|
|
|
+ IFNULL(SUM(total_reg_num), 0) as total_reg_num,
|
|
|
|
+ IFNULL(SUM(total_amount_num), 0) as total_amount_num,
|
|
|
|
+ IFNULL(SUM(total_amount), 0) as total_amount,
|
|
|
|
+ """ + trendDayForServerDay() +
|
|
|
|
+ """
|
|
|
|
+ FROM (
|
|
|
|
+ SELECT
|
|
|
|
+ dt,
|
|
|
|
+ source_system,
|
|
|
|
+ server_id,
|
|
|
|
+ server_name,
|
|
|
|
+ game_id,
|
|
|
|
+ game_name,
|
|
|
|
+ classify,
|
|
|
|
+ out_total_num,
|
|
|
|
+ out_total_amount_num,
|
|
|
|
+ out_total_amount,
|
|
|
|
+ out_total_rate,
|
|
|
|
+ total_role_num,
|
|
|
|
+ total_reg_num,
|
|
|
|
+ total_amount_num,
|
|
|
|
+ total_amount,
|
|
|
|
+ SPLIT(da1, '/') as da1,
|
|
|
|
+ SPLIT(da2, '/') as da2,
|
|
|
|
+ SPLIT(da3, '/') as da3,
|
|
|
|
+ SPLIT(da4, '/') as da4,
|
|
|
|
+ SPLIT(da5, '/') as da5,
|
|
|
|
+ SPLIT(da6, '/') as da6,
|
|
|
|
+ SPLIT(da7, '/') as da7,
|
|
|
|
+ SPLIT(da8, '/') as da8,
|
|
|
|
+ SPLIT(da9, '/') as da9,
|
|
|
|
+ SPLIT(da10, '/') as da10,
|
|
|
|
+ SPLIT(da11, '/') as da11,
|
|
|
|
+ SPLIT(da12, '/') as da12,
|
|
|
|
+ SPLIT(da13, '/') as da13,
|
|
|
|
+ SPLIT(da14, '/') as da14,
|
|
|
|
+ SPLIT(da15, '/') as da15,
|
|
|
|
+ SPLIT(da16, '/') as da16,
|
|
|
|
+ SPLIT(da17, '/') as da17,
|
|
|
|
+ SPLIT(da18, '/') as da18,
|
|
|
|
+ SPLIT(da19, '/') as da19,
|
|
|
|
+ SPLIT(da20, '/') as da20,
|
|
|
|
+ SPLIT(da21, '/') as da21,
|
|
|
|
+ SPLIT(da22, '/') as da22,
|
|
|
|
+ SPLIT(da23, '/') as da23,
|
|
|
|
+ SPLIT(da24, '/') as da24,
|
|
|
|
+ SPLIT(da25, '/') as da25,
|
|
|
|
+ SPLIT(da26, '/') as da26,
|
|
|
|
+ SPLIT(da27, '/') as da27,
|
|
|
|
+ SPLIT(da28, '/') as da28,
|
|
|
|
+ SPLIT(da29, '/') as da29,
|
|
|
|
+ SPLIT(da30, '/') as da30,
|
|
|
|
+ SPLIT(da31, '/') as da31,
|
|
|
|
+ SPLIT(da32, '/') as da32,
|
|
|
|
+ SPLIT(da33, '/') as da33,
|
|
|
|
+ SPLIT(da34, '/') as da34,
|
|
|
|
+ SPLIT(da35, '/') as da35,
|
|
|
|
+ SPLIT(da36, '/') as da36,
|
|
|
|
+ SPLIT(da37, '/') as da37,
|
|
|
|
+ SPLIT(da38, '/') as da38,
|
|
|
|
+ SPLIT(da39, '/') as da39,
|
|
|
|
+ SPLIT(da40, '/') as da40,
|
|
|
|
+ SPLIT(da41, '/') as da41,
|
|
|
|
+ SPLIT(da42, '/') as da42,
|
|
|
|
+ SPLIT(da43, '/') as da43,
|
|
|
|
+ SPLIT(da44, '/') as da44,
|
|
|
|
+ SPLIT(da45, '/') as da45,
|
|
|
|
+ SPLIT(da46, '/') as da46,
|
|
|
|
+ SPLIT(da47, '/') as da47,
|
|
|
|
+ SPLIT(da48, '/') as da48,
|
|
|
|
+ SPLIT(da49, '/') as da49,
|
|
|
|
+ SPLIT(da50, '/') as da50,
|
|
|
|
+ SPLIT(da51, '/') as da51,
|
|
|
|
+ SPLIT(da52, '/') as da52,
|
|
|
|
+ SPLIT(da53, '/') as da53,
|
|
|
|
+ SPLIT(da54, '/') as da54,
|
|
|
|
+ SPLIT(da55, '/') as da55,
|
|
|
|
+ SPLIT(da56, '/') as da56,
|
|
|
|
+ SPLIT(da57, '/') as da57,
|
|
|
|
+ SPLIT(da58, '/') as da58,
|
|
|
|
+ SPLIT(da59, '/') as da59,
|
|
|
|
+ SPLIT(da60, '/') as da60,
|
|
|
|
+ SPLIT(da61, '/') as da61,
|
|
|
|
+ SPLIT(da62, '/') as da62,
|
|
|
|
+ SPLIT(da63, '/') as da63,
|
|
|
|
+ SPLIT(da64, '/') as da64,
|
|
|
|
+ SPLIT(da65, '/') as da65,
|
|
|
|
+ SPLIT(da66, '/') as da66,
|
|
|
|
+ SPLIT(da67, '/') as da67,
|
|
|
|
+ SPLIT(da68, '/') as da68,
|
|
|
|
+ SPLIT(da69, '/') as da69,
|
|
|
|
+ SPLIT(da70, '/') as da70,
|
|
|
|
+ SPLIT(da71, '/') as da71,
|
|
|
|
+ SPLIT(da72, '/') as da72,
|
|
|
|
+ SPLIT(da73, '/') as da73,
|
|
|
|
+ SPLIT(da74, '/') as da74,
|
|
|
|
+ SPLIT(da75, '/') as da75,
|
|
|
|
+ SPLIT(da76, '/') as da76,
|
|
|
|
+ SPLIT(da77, '/') as da77,
|
|
|
|
+ SPLIT(da78, '/') as da78,
|
|
|
|
+ SPLIT(da79, '/') as da79,
|
|
|
|
+ SPLIT(da80, '/') as da80,
|
|
|
|
+ SPLIT(da81, '/') as da81,
|
|
|
|
+ SPLIT(da82, '/') as da82,
|
|
|
|
+ SPLIT(da83, '/') as da83,
|
|
|
|
+ SPLIT(da84, '/') as da84,
|
|
|
|
+ SPLIT(da85, '/') as da85,
|
|
|
|
+ SPLIT(da86, '/') as da86,
|
|
|
|
+ SPLIT(da87, '/') as da87,
|
|
|
|
+ SPLIT(da88, '/') as da88,
|
|
|
|
+ SPLIT(da89, '/') as da89,
|
|
|
|
+ SPLIT(da90, '/') as da90,
|
|
|
|
+ SPLIT(m4, '/') as m4,
|
|
|
|
+ SPLIT(m5, '/') as m5,
|
|
|
|
+ SPLIT(m6, '/') as m6,
|
|
|
|
+ SPLIT(m7, '/') as m7,
|
|
|
|
+ SPLIT(m8, '/') as m8,
|
|
|
|
+ SPLIT(m9, '/') as m9,
|
|
|
|
+ SPLIT(m10, '/') as m10,
|
|
|
|
+ SPLIT(m11, '/') as m11,
|
|
|
|
+ SPLIT(m12, '/') as m12,
|
|
|
|
+ SPLIT(total, '/') as total
|
|
|
|
+ FROM
|
|
|
|
+ game_ads.ads_game_server_day_sum
|
|
|
|
+ ) a
|
|
|
|
+ """;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
|
|
}
|
|
}
|