Я работаю над веб-приложением на основе Spring MVC. Я реализовал графическое представление данных, актуальных для моего клиента. это очень просто. Мне нужно проиллюстрировать количество зарегистрированных сотрудников и проверенных сотрудников на ежедневной основе регистрации и проверки.
Я написал запрос ниже,
SELECT monthyear
,SUM(CASE WHEN type='1' THEN total ELSE 0 END )as tot_ver
,SUM(CASE WHEN type='2' THEN total ELSE 0 END )as tot_reg
FROM (
SELECT
TO_CHAR(verify_date,'YYYY-mm-dd') as monthyear
,SUM(CASE WHEN verify_status=1 THEN 1 ELSE 0 END )as total
,'1' as type
FROM EMPLOYEE
GROUP BY TO_CHAR(verify_date,'YYYY-mm-dd')
UNION ALL
SELECT TO_CHAR(add_date,'YYYY-mm') as monthyear
,SUM(CASE WHEN emp_id!=0 THEN 1 ELSE 0 END )as total
,'2' as type
FROM EMPLOYEE
GROUP BY TO_CHAR(add_date,'YYYY-mm-dd')
)
where monthyear IS NOT NULL
GROUP BY monthyear
ORDER BY monthyear
И КОД ЯВА
public TwoValueBean totRegisterUser() {
String query = " SELECT monthyear"
+ " ,SUM(CASE WHEN type='1' THEN total ELSE 0 END )as tot_ver"
+ " ,SUM(CASE WHEN type='2' THEN total ELSE 0 END )as tot_reg "
+ " FROM ("
+ " SELECT "
+ " TO_CHAR(verify_date,'YYYY-mm') as monthyear"
+ " ,SUM(CASE WHEN verify_status=1 THEN 1 ELSE 0 END )as total"
+ " ,'1' as type "
+ " FROM EMPLOYEE"
+ " GROUP BY TO_CHAR(verify_date,'YYYY-mm') "
+ " UNION ALL"
+ " SELECT TO_CHAR(add_date,'YYYY-mm') as monthyear "
+ " ,SUM(CASE WHEN emp_id!=0 THEN 1 ELSE 0 END )as total"
+ " ,'2' as type"
+ " FROM EMPLOYEE"
+ " GROUP BY TO_CHAR(add_date,'YYYY-mm')"
+ " ) "
+ " where monthyear IS NOT NULL "
+ " GROUP BY monthyear"
+ " ORDER BY monthyear";
MapSqlParameterSource param = new MapSqlParameterSource();
TwoValueBean bean = new TwoValueBean();
try {
List<TotalRegisterGraphData> list = getNamedParameterJdbcTemplate().query(query, param, new RowMapper<TotalRegisterGraphData>() {
@Override
public TotalRegisterGraphData mapRow(ResultSet rs, int rowNo) throws SQLException {
TotalRegisterGraphData regData = new TotalRegisterGraphData();
regData.setRegMonth(rs.getString("monthyear"));
regData.setTotRegister(rs.getLong("tot_reg"));
regData.setTotVerify(rs.getLong("tot_ver"));
return regData;
}
});
if (list != null && list.size() > 0) {
String reqDate = "";
List<String> val1 = new ArrayList<String>();
List<String> val2 = new ArrayList<String>();
List<String> val3 = new ArrayList<String>();
int currentVer = 0;
int currentReg = 0;
for (TotalRegisterGraphData data : list) {
currentReg += data.getTotRegister();
currentVer += data.getTotVerify();
val1.add("'" +data.getRegMonth()+ "'");
val2.add(String.valueOf(currentReg));
val3.add(String.valueOf(currentVer));
}
bean.setVal1(StringProcessorUtil.arrayToString(val1.toArray(new String[]{}), null));
bean.setVal2(StringProcessorUtil.arrayToString(val2.toArray(new String[]{}), null));
bean.setVal3(StringProcessorUtil.arrayToString(val3.toArray(new String[]{}), null));
}
} catch (Exception e) {
e.printStackTrace();
}
return bean;
}
}
Как вы можете видеть, запрос извлекает данные от имени дня регистрации, но также следует отметить, что он суммирует счетчик, как только пользователь регистрируется, он показывает максимальное количество на определенную дату.
Что я хочу, мне нужно точное количество зарегистрированный сотрудник в определенный день.
Например: если 50 сотрудников будут зарегистрированы 24-11-2018, то счет будет показан как 50, а не 50 + все предыдущие регистрации.
Аналогичный случай возникает для проверенного сотрудника.
Регистрация - это первый этап (в запросе tot_reg содержит счет)
Проверка - заключительный этап (в запросе tot_ver содержит счет)
Регистрацию можно получить по add_date.
и
подтверждение можно получить по verify_date.
Для большей ясности я также прикрепил графическое изображение n, на котором синими линиями показаны зарегистрированные сотрудники, а черными линиями показано количество проверенных сотрудников, но вы, люди, можете наблюдать, чем, оно показывает максимальное количество на конкретную дату.
Например.
если зарегистрирован 1 человек, то на 01-01-2018 отображается 1
если в следующие два дня зарегистрировалось еще 1 человек, то отображается 2
если 2 человека зарегистрировались 05.01.2018, то отображается 4
Я не хочу, чтобы это произошло, я хочу, чтобы количество зарегистрированных пользователей в день.
если 10 человек зарегистрировались 08.01.2018, то должно быть показано 10 если еще 20 человек зарегистрировались 09.01.2018, то отображается 20 аналогично для проверенного сотрудника


Ваш SQL-запрос возвращает данные, которые вы запрашиваете, то есть возвращает день (который вы ошибочно назвали месяцем) и количество сотрудников, зарегистрированных / проверенных в этот день.
Это ваш код Java, который накапливает счет
Измените это:
currentReg += data.getTotRegister();
currentVer += data.getTotVerify();
К этому:
currentReg = data.getTotRegister();
currentVer = data.getTotVerify();
Обратите внимание: похоже, в запросе есть ошибка:
SELECT TO_CHAR(add_date,'YYYY-mm') as monthyear --month precision, will give repeated rows
...
GROUP BY TO_CHAR(add_date,'YYYY-mm-dd') --day precision
И ваш запрос, вставленный в верхнее поле, не соответствует запросу в java-коде.
Охххкк, большое спасибо, но вам не кажется, что на каждой итерации я теряю предыдущие значения
Эмм. Это то, о чем вы просили?
ohkk, затем предложите мне решение, чтобы я мог отслеживать каждое свое значение за итерацию
иметь 4 переменные; 2 что делают ваши += и 2 что делают ваш =?
Рассмотрите возможность удаления тега SQL из этого вопроса